代替从那里注入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最终版本中,并且被认为是错误。
此错误已在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);
}
}
获得任意的投影内容
请参阅访问包含的内容