美文网首页我爱编程
Angular 中的 ElementRef

Angular 中的 ElementRef

作者: moving_mG | 来源:发表于2018-02-26 11:03 被阅读0次

    ElementRef 顾名思义是元素参阅。

    其实在实际应用中就是获取视图层的dom元素,借助Augular提供的依赖注入机制,轻松的访问到dom元素。


    ElementRef的定义

     export class ElementRef {
          public nativeElement: any;
          constructor(nativeElement: any) { this.nativeElement = nativeElement; }
    }
    

    ElementRef的应用

    我们先来介绍一下整体需求,我们想在页面成功渲染后,获取页面中的 div 元素,并改变该 div 元素的背景颜色。接下来我们来一步步,实现这个需求。

    首先我们要先获取 div 元素,在文中 "ElementRef 的作用" 部分,我们已经提到可以利用 Angular 提供的强大的依赖注入特性,获取封装后的 native 元素。在浏览器中 native 元素就是 DOM 元素,我们只要先获取 my-app元素,然后利用 querySelector API 就能获取页面中 div 元素。具体代码如下:

    import { Component, ElementRef } from '@angular/core';
    
    @Component({
        selector: 'my-app',
        template: `
          <h1>Welcome to Angular World</h1>
          <div>Hello {{ name }}</div>
        `,
    })
    export class AppComponent {
    
         name: string = 'mh';
    
         constructor(private elementRef: ElementRef) {
         let divEle = this.elementRef.nativeElement.querySelector('div');
         console.dir(divEle);
      }
    }
    

    运行上面代码,在控制台中没有出现异常,但是输出的结果却是 null 。什么情况 ? 没有抛出异常,我们可以推断 this.elementRef.nativeElement 这个对象是存在,但却找不到它的子元素,那应该是在调用构造函数的时候,my-app 元素下的子元素还未创建。那怎么解决这个问题呢 ?沉思中… ,angular内部提供了声明周期钩子,那我们来改造一波:

    import { Component, ElementRef, AfterViewInit } from '@angular/core';
    
    @Component({
      selector: 'my-app',
      template: `
        <h1>Welcome to Angular World</h1>
        <div>Hello {{ name }}</div>
      `,
    })
    export class AppComponent {
    
      name: string = 'xiaowang';
    
      // 在构造函数中 this.elementRef = elementRef 是可选的,编译时会自动赋值
      // function AppComponent(elementRef) { this.elementRef = elementRef; }
      constructor(private elementRef: ElementRef) { } 
    
      ngAfterViewInit() { // 模板中的元素已创建完成
        console.dir(this.elementRef.nativeElement.querySelector('div'));
        // let greetDiv: HTMLElement = this.elementRef.nativeElement.querySelector('div'); 
        // greetDiv.style.backgroundColor = 'red';
      }
    }
    

    上述的代码中,我们用了ngAfterViewInit 这个钩子,也是顾名思义,在视图初始化完毕之后调用,这样就可以成功的获取template中的dom节点元素啦。


    未完待续。

    相关文章

      网友评论

        本文标题:Angular 中的 ElementRef

        本文链接:https://www.haomeiwen.com/subject/pajexftx.html