zoukankan      html  css  js  c++  java
  • [Angular 2] ElementRef, @ViewChild & Renderer

    ElementRef:

    In Angular2 Doc, it suggest to "avoid" using ElementRef. It access DOM directly, can easily be attacked.

    import {Component, OnInit, ViewChild, Renderer, ElementRef} from '@angular/core';
    
    @Component({
        moduleId: module.id,
        selector: 'widget-three',
        template: `<input type="text" #inputRef/>`
    })
    export class WidgetThree {
    
        constructor(private elm: ElementRef) {
            console.log("elm:", this.elm)
    
        }
    }
       

    If we log out the ElementRef, we can see, it refer to host element.

    Renderer:

    In the doc, it also suggest, if you want to change some dom prop, use Renderer instead. ElementRef can be just a reference to access native element object.

    import { Directive, ElementRef, Input, Renderer } from '@angular/core';
    @Directive({ selector: '[myHighlight]' })
    export class HighlightDirective {
        constructor(el: ElementRef, renderer: Renderer) {
           renderer.setElementStyle(el.nativeElement, 'backgroundColor', 'yellow');
        }
    }

    This will set the host element background as yellow.

    @ViewChild():

    Access Child element by Ref or Class Object.

    import {Component, OnInit, ViewChild, Renderer} from '@angular/core';
    
    @Component({
        moduleId: module.id,
        selector: 'widget-three',
        template: `<input type="text" #inputRef/>`
    })
    export class WidgetThree {
    
        @ViewChild('inputRef') input;
    
        constructor(private renderer: Renderer) {
        }
        
        ngAfterViewInit(){
            this.renderer.invokeElementMethod(
                this.input.nativeElement,
                'focus',
                []
            );
        }
    }

    Here we have a ref "inputRef", we use ref to access input element.

    'invokeElementMethod' will call the 'focus' method the the input nativeElement which should be:

    this.input.nativeElement.focus()

    But the risk is on mobile it might have different method to focus on input, 'invokeElementMethod' can safely help us to call the method .

  • 相关阅读:
    洛谷 P2756 飞行员配对方案问题 (二分图匹配)
    HDU 1879 继续畅通工程 (最小生成树)
    POJ 3090 Visible Lattice Points (欧拉函数)
    SPOJ VFMUL
    洛谷 P3803 【模板】多项式乘法(FFT)
    JAVA MyBatis 逆向工程 遇到的坑
    RabbitMQ遇到的坑
    .net webapi action拦截器 统计action耗时
    CEFCharp下载问题
    【进击.NET高级程序员之路】【二】
  • 原文地址:https://www.cnblogs.com/Answer1215/p/5898545.html
Copyright © 2011-2022 走看看