Жизненный цикл компонента¶
Каждый компонент имеет свой жизненный цикл (Component Lifecycle), в процессе которого вызываются ряд описывающих текущий этап методов (Angular Hooks):
OnChanges
— устанавливаются или изменяются значения входных свойств класса компонента;OnInit
— устанавливаются "обычные" свойства; вызывается единожды вслед за первым вызовомOnChanges()
;DoCheck
— происходит изменения свойства или вызывается какое-либо событие;AfterContentInit
— в шаблон включается контент, заключенный между тегами компонента;AfterContentChecked
— аналогиченDoCheck()
, только используется для контента, заключенного между тегами компонента;AfterViewInit
— инициализируются компоненты, которые входят в шаблон текущего компонента;AfterViewChecked
— аналогиченDoCheck()
, только используется для дочерних компонентов;OnDestroy
— компонент "умирает", т. е. удаляется из DOM-дерева
В списке выше все методы перечислены в порядке их вызова.
Angular hooks реализованы в виде интерфейсов, реализующих функцию, совпадающую по названию с названием интерфейса + префикс ng
.
1 2 3 4 5 6 7 |
|
Чтобы стало понятно, разберем пример.
hooks-example.component.ts
1 2 3 4 5 6 7 8 9 |
|
contacts-list.component.ts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
|
contacts-item.component.ts
1 2 3 4 5 6 7 |
|
Запустите приложение c открытой консолью браузера. На примере Component Lifecycle выглядит так:
Первым вызывается OnChanges()
, повторный вызов которого осуществляется при изменении хотя бы одного входного свойства. В качестве аргумента ему передается объект с текущим и предыдущим значениями измененных @Input()
свойств.
Если входные свойства отсутствуют, то метод не будет вызван.
Следом вызывается OnInit()
, который говорит о том, что инициализированы внутренние свойства компонента, в данном случае свойство company
. Метод вызывается только один раз.
Третьим по счету идет DoCheck()
, который отслеживает изменения, не связанные со свойствами. Его вызов осуществляется довольно часто, в ответ на каждое взаимодействие пользователя с интерфейсом (например, фокусировка поля формы или потеря фокуса).
Далее инициализируются шаблоны. Сначала подгружается контент, находящийся между тегами компонента. За это отвечает ngAfterContentInit()
.
Для отображения переданного контента в представлении компонента используется парный тег <ng-content></ng-content>
.
На этом этапе Component Lifecycle можно получить переданный извне компонент. Для этого используется декоратор @ContentChild()
, который в качестве аргумента принимает название компонента, также рекомендуется указывать его тип. Передавать можно не только компонент, но и обычный HTML, доступ к которому осуществляется через ссылку на него, подробно здесь.
1 |
|
Следующим при любых изменениях во внешнем шаблоне вызывается ngAfterContentChecked()
.
Если вам нужно получить все экземпляры указанного компонента, используйте декоратор @ContentChildren()
.
Методы ngAfterViewInit()
и ngAfterViewChecked()
схожи с ngAfterContentInit()
и ngAfterContentChecked()
лишь с тем различием, что первые два вызываются после полной иницализации шаблона.
Используя декораторы @ViewChild()
и @ViewChildren()
можно получить доступ к прямым дочерним компонентам.
Как и сами Angular Hooks, декораторы находятся в библиотеке @angular/core
.
Чтобы инициировать вызов OnDestroy()
, необходимо удалить компонент из DOM-дерева (переход на другой URL или с помощью *ngIf
).