Почему для доступа к элементам и манипуляции с ними лучше использовать renderer методы (а не доступ через нативный JS)?
Использование renderer дает нам возможность быть уверенными,что все манипуляции с элементами будут работать в окружениях, где нет DOM (мобильные и десктопные приложения, веб воркеры).
export class someComponent implements OnInit {
innerWidth: number;
isMobile: boolean;
mobileWindowWidth: number = 768;
ngOnInit() {
this.innerWidth = window.innerWidth;
this.isMobile = this.innerWidth > this.mobileWindowWidth ? false : true;
}
@HostListener("window:resize", ["$event"])
onResize($event) {
this.innerWidth = window.innerWidth;
this.isMobile = this.innerWidth > this.mobileWindowWidth ? false : true;
}
}
При изменении переменной isMobile
можно изменять класс элемента в шаблоне или менять/добавлять css-свойство.
Также можно использовать npm-пакеты (пример: https://www.npmjs.com/package/angular-resize-event).
Наиболее распространенное использование такого сервиса - оптимизация производительности при запуске работы, состоящей из одной или нескольких асинхронных задач, которые не требуют обновления пользовательского интерфейса или обработки ошибок для обработки с помощью Angular. Такие задачи можно запускать через runOutsideAngular
, и при необходимости эти задачи могут повторно входить в зону Angular через run
.
При реализации drag and drop мы должны следить за событиями onmousedown
, onmousemove
и onmouseup
. При вызове onmousedown
мы можем вывести onmousemove
из зоны angular, чтобы это событие не вызывало change detection. А при onmouseup
мы триггерим change detection и обновляем позицию перетаскиваемого элемента с помощью run
.
Защитить компонент от активации можно с помощью гардов CanActivate,CanActivateChild, CanDeactivate, CanLoad. Гарды можно написать по разному, но в итоге они возвращают или Observable или Promise или true/false. Гарды регистрируются в providers.
@ContentChild
и @ViewChild
используются для доступа к первому элементу или директиве, соответствующим селектору.
@ContentChild
:
- Запросы контента делаются перед
ngAfterContentInit
(послеngOnInit
иngDoCheck
) - Невозможно получить элементы или директивы, которые находятся в шаблонах других компонентов.
@ViewChild
:
- Запросы представления делаются перед
ngAfterViewInit
(послеngAfterContentInit
иngAfterContentChecked
) - Поддерживает запросы к DOM
- К любому классу в декораторами
@Component
или@Directive
- К переменной шаблона (т.е. к
<my-component #cmp></my-component>
через@ViewChild('cmp')
) - К любому провайдеру из дочернего компонента текущего компонента (т.е.
@ViewChild(SomeService) someService: SomeService
) - К
TemplateRef
(т.е.@ViewChild(TemplateRef) template
)
- К любому классу в декораторами
Внедрение зависимостей или Dependency Injection - это шаблон проектирования, в котором класс запрашивает зависимости из внешних источников, а не создает их.
Constructor
- это дефолтный метод класса, который выполняется при создании экземпляра класса и обеспечивает правильную инициализацию полей в классе и его подклассах. В Angular используется для Dependency Injection. Constructor
- это не фича Angular. Это концепция объектно-ориентированного программирования.
ngOnInit
- это метод жизненного цикла компонента. Вызывается один раз после установки свойств компонента, которые участвуют в привязке. Выполняет инициализацию компонента.
Основная роль ngOnInit
- подать сигнал о том, что Angular завершил инициализацию компонента и что пользователи могут продолжить работу. Constructor
в основном используется для инициализации членов класса, но он не может выполнить всю работу. Он полезен только в случае внедрения зависимостей и инициализации поля класса. Нужно избегать написания логики в конструкторе. ngOnInit
- лучшее место для написания кода, который требуется во время создания экземпляра класса.
Service worker - это скрипт, который запускается в браузере и управляет кэшированием приложения.
Сервис-воркеры позволяют приложениям обеспечивать удобство работы пользователей с надежностью и производительностью, сопоставимой с нативными приложениями. Добавление сервис-воркера в приложение Angular - это один из шагов по превращению приложения в прогрессивное веб-приложение (PWA).
Зоны предоставляют механизм перехвата планирования и вызова асинхронных операций. Логика перехватчика может выполнять дополнительный код до или после задачи и уведомлять заинтересованные стороны о событии.
Источники:
https://blog.thoughtram.io/angular/2017/02/21/using-zones-in-angular-for-better-performance.html
Пример гарда
https://angular.io/api/core/ContentChild
https://angular.io/api/core/ViewChild