Замість того, щоб звідти вводити ElementRef
та використовувати querySelector
або подібне, декларативний спосіб може бути використаний замість прямого доступу до елементів у поданні:
<input #myname>
@ViewChild('myname') input;
елемент
ngAfterViewInit() {
console.log(this.input.nativeElement.value);
}
Приклад StackBlitz
- @ViewChild () підтримує директиву або тип компонента як параметр або ім'я (рядок) змінної шаблону.
- @ViewChildren () також підтримує список імен як список, розділених комами (на даний момент не допускається пробілів
@ViewChildren('var1,var2,var3')
).
- @ContentChild () та @ContentChildren () роблять те саме, але у світлі DOM (
<ng-content>
проектовані елементи).
нащадків
@ContentChildren()
є єдиним, що дозволяє також запитувати нащадків
@ContentChildren(SomeTypeOrVarName, {descendants: true}) someField;
{descendants: true}
має бути за замовчуванням, але не в 2.0.0 остаточному, і вважається помилкою
Це було виправлено в 2.0.1
читати
Якщо є компонент і директиви, read
параметр дозволяє вказати, який екземпляр повинен бути повернутий.
Наприклад, ViewContainerRef
що вимагають динамічно створені компоненти замість типовихElementRef
@ViewChild('myname', { read: ViewContainerRef }) target;
підписатися на зміни
Навіть незважаючи на те, що діти перегляду встановлюються лише тоді, коли ngAfterViewInit()
викликається, а вміст дітей встановлюється лише тоді, коли ngAfterContentInit()
викликається, якщо ви хочете підписатися на зміни результату запиту, це слід зробити вngOnInit()
https://github.com/angular/angular/isissue/9689#issuecomment-229247134
@ViewChildren(SomeType) viewChildren;
@ContentChildren(SomeType) contentChildren;
ngOnInit() {
this.viewChildren.changes.subscribe(changes => console.log(changes));
this.contentChildren.changes.subscribe(changes => console.log(changes));
}
прямий доступ DOM
може запитувати лише елементи DOM, але не компоненти компонентів чи директиви:
export class MyComponent {
constructor(private elRef:ElementRef) {}
ngAfterViewInit() {
var div = this.elRef.nativeElement.querySelector('div');
console.log(div);
}
// for transcluded content
ngAfterContentInit() {
var div = this.elRef.nativeElement.querySelector('div');
console.log(div);
}
}
отримати довільний проектований контент
Див. Розділ Доступ до вмісту, що виключається