与其从那里进行注入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);
}
}
获取任意投影内容
请参阅访问嵌入的内容