そこからインジェクションElementRef
して使用しquerySelector
たり、類似のものを使用する代わりに、宣言的な方法を使用して、ビュー内の要素に直接アクセスできます。
<input #myname>
@ViewChild('myname') input;
素子
ngAfterViewInit() {
console.log(this.input.nativeElement.value);
}
StackBlitzの例
子孫
@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);
}
}
任意の投影コンテンツを取得する
トランスクリプションされたコンテンツへのアクセスを参照してください