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);
                    }