Вместо того, чтобы вводить 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 final, и это считается ошибкой.
Это было исправлено в 2.0.1.
читать
Если есть компонент и директивы, read
параметр позволяет указать, какой экземпляр должен быть возвращен.
Например ViewContainerRef
, это требуется для динамически создаваемых компонентов, а не по умолчаниюElementRef
@ViewChild('myname', { read: ViewContainerRef }) target;
подписаться на изменения
Даже если дочерние элементы представления устанавливаются только при ngAfterViewInit()
вызове, а дочерние элементы содержимого устанавливаются только при ngAfterContentInit()
вызове, если вы хотите подписаться на изменения результата запроса, это следует сделать вngOnInit()
https://github.com/angular/angular/issues/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);
}
}
получить произвольный проектируемый контент
См. Доступ к включенному контенту