angular 2 掌握 Angular 中的元素 2 用于 Material design lite
angular 2 getting hold of an element in Angular 2 for use in Material design lite
我想使用 Angular 中的 Material Design Lite snackbar 2.
我试图在我的模板中获取元素,如下所示:
我的模板
<test>
<div id="child1"> child1 <div id="child2">
<div id="child2"> child2 <div id="child2">
<div id="toast_error"> Error message </div>
</div>
</div>
</div>
</test>
在我的组件文件中
constructor(private el:ElementRef){}
ngOnInit(){
this.show_error("something");
}
show_error(err){
var snackbarContainer = this.el.nativeElement.querySelector("#toast_error")
var data = {
message: 'Button color changed.',
timeout: 2000,
actionText: 'Undo'
};
snackbarContainer.MaterialSnackbar.showSnackbar(data);
}
我收到以下错误消息。如何获取 ID 为 toast_error
的元素
EXCEPTION: TypeError: Cannot read property 'MaterialSnackbar' of null in [null]
PS:我检查过 this.el.nativeElement
确实给我正确的参考
编辑
根据答案和评论,我现在可以通过在 ngAfterViewInit
中使用相同的代码来获取元素。但是,我无法让小吃店工作。以下是更新后的代码。
在我的组件文件中
constructor(private el:ElementRef){}
ngAfterViewInit(){
var snackbarContainer = this.el.nativeElement.querySelector("#toast_error")
var data = {
message: 'Button color changed.',
timeout: 2000,
actionText: 'Undo'
};
console.log(snackbarContainer.MaterialSnackbar); //prints undefined
//snackbarContainer.MaterialSnackbar.showSnackbar(data);
}
console.log()
命令打印未定义。我已确保 material.min.js 已加载并检查文件,它确实包含 MaterialSnackbar
。我应该如何调试它?
如果您需要直接访问 DOM 元素,请注入 ElementRef
:
constructor(ref: ElementRef) ...
然后使用以下方法访问 DOM 元素:
ref.nativeElement
有关详细信息,请参阅 here。
然后尝试使用 AfterViewInit
而不是 OnInit
,以确保 DOM 在 运行 DOM 查询之前初始化 -> 请参阅 here.
您可以使用模板变量和 @ViewChild
来获取特定元素:
<div id="toast_error" #toastError> Error message </div>
@ViewChile('toastError') toastErrorDiv;
ngAfterViewInit() {
toastErrorDiv.doSomething();
}
我通过将代码放在 ngAfterViewInit()
中并调用 upgradeElement
解决了这个问题,如下所示:
constructor(private el:ElementRef){}
ngAfterViewInit(){
window.componentHandler.upgradeAllRegistered();
var snackbarContainer = this.el.nativeElement.querySelector("#toast_error")
var data = {
message: 'Button color changed.',
timeout: 2000,
actionText: 'Undo'
};
snackbarContainer.MaterialSnackbar.showSnackbar(data);
}
我想使用 Angular 中的 Material Design Lite snackbar 2.
我试图在我的模板中获取元素,如下所示:
我的模板
<test>
<div id="child1"> child1 <div id="child2">
<div id="child2"> child2 <div id="child2">
<div id="toast_error"> Error message </div>
</div>
</div>
</div>
</test>
在我的组件文件中
constructor(private el:ElementRef){}
ngOnInit(){
this.show_error("something");
}
show_error(err){
var snackbarContainer = this.el.nativeElement.querySelector("#toast_error")
var data = {
message: 'Button color changed.',
timeout: 2000,
actionText: 'Undo'
};
snackbarContainer.MaterialSnackbar.showSnackbar(data);
}
我收到以下错误消息。如何获取 ID 为 toast_error
EXCEPTION: TypeError: Cannot read property 'MaterialSnackbar' of null in [null]
PS:我检查过 this.el.nativeElement
确实给我正确的参考
编辑
根据答案和评论,我现在可以通过在 ngAfterViewInit
中使用相同的代码来获取元素。但是,我无法让小吃店工作。以下是更新后的代码。
在我的组件文件中
constructor(private el:ElementRef){}
ngAfterViewInit(){
var snackbarContainer = this.el.nativeElement.querySelector("#toast_error")
var data = {
message: 'Button color changed.',
timeout: 2000,
actionText: 'Undo'
};
console.log(snackbarContainer.MaterialSnackbar); //prints undefined
//snackbarContainer.MaterialSnackbar.showSnackbar(data);
}
console.log()
命令打印未定义。我已确保 material.min.js 已加载并检查文件,它确实包含 MaterialSnackbar
。我应该如何调试它?
如果您需要直接访问 DOM 元素,请注入 ElementRef
:
constructor(ref: ElementRef) ...
然后使用以下方法访问 DOM 元素:
ref.nativeElement
有关详细信息,请参阅 here。
然后尝试使用 AfterViewInit
而不是 OnInit
,以确保 DOM 在 运行 DOM 查询之前初始化 -> 请参阅 here.
您可以使用模板变量和 @ViewChild
来获取特定元素:
<div id="toast_error" #toastError> Error message </div>
@ViewChile('toastError') toastErrorDiv;
ngAfterViewInit() {
toastErrorDiv.doSomething();
}
我通过将代码放在 ngAfterViewInit()
中并调用 upgradeElement
解决了这个问题,如下所示:
constructor(private el:ElementRef){}
ngAfterViewInit(){
window.componentHandler.upgradeAllRegistered();
var snackbarContainer = this.el.nativeElement.querySelector("#toast_error")
var data = {
message: 'Button color changed.',
timeout: 2000,
actionText: 'Undo'
};
snackbarContainer.MaterialSnackbar.showSnackbar(data);
}