angular 2获取Angular 2中的元素以用于Material design lite

时间:2016-02-24 06:44:01

标签: angular material-design-lite

我想在Angular 2中使用Material Design Lite snackbar

我试图在我的模板中抓住Element,如下所示:

我的模板

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

我收到以下错误消息。如何获取标识为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。我该怎么调试呢?

3 个答案:

答案 0 :(得分:3)

我将代码置于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);
                    }

答案 1 :(得分:2)

如果您需要直接访问DOM元素,请注入ElementRef

constructor(ref: ElementRef) ...

然后使用:

访问DOM元素
ref.nativeElement

有关详细信息,请参阅here

然后使用OnInit代替AfterViewInit,以确保在运行DOM查询之前初始化DOM - &gt;见here

答案 2 :(得分:0)

您可以使用模板变量和@ViewChild来获取特定元素:

<div id="toast_error" #toastError> Error message </div>



@ViewChile('toastError') toastErrorDiv;

ngAfterViewInit() {
  toastErrorDiv.doSomething();
}