Angular的ElementRef

獲取DOM可能會(huì)使用原生的(如:document.getElementById('id'));或者引入Jquery獲取jquery對(duì)象獲取元素嫌拣。但在angular中千萬(wàn)別這么使用~~~因?yàn)楣倬W(wǎng)API給我們提供更好的方法颜骤。

1.ElementRef

從官網(wǎng)可以看出唧喉,通過(guò) ElementRef 我們就可以封裝不同平臺(tái)下視圖層中的 native 元素 (在瀏覽器環(huán)境中,native 元素通常是指 DOM 元素),最后借助于 Angular 2 提供的強(qiáng)大的依賴注入特性八孝,我們就可以輕松地訪問(wèn)到 native 元素董朝。

例子:

<div style="width:100px;height:100px;border:1px solid red" class="btn1">按鈕一</div>
<p>了解ElementRef</p>
import { ElementRef} from '@angular/core';
  constructor( private el:ElementRef){}
  ngOnInit(){
    console.log(this.el.nativeElement);
    this.el.nativeElement.querySelector('.btn1').style.height = '300px';
  }

我們來(lái)看看打印出來(lái)的this.el.nativeElement是什么?


image.png

可以看到nativeElement其實(shí)包含的是組件中所有的DOM元素干跛。如果想獲取頁(yè)面某個(gè)元素子姜,可以使用querySelector獲取某個(gè)元素或者querySelectorAll獲取多個(gè)元素。

但是我們要盡量減少應(yīng)用層與渲染層之間強(qiáng)耦合關(guān)系楼入,從而讓我們應(yīng)用能夠靈活地運(yùn)行在不同環(huán)境哥捕。怎么做了?我們需要renderer2

【在Angular4中renderer已經(jīng)廢棄掉了嘉熊,變成了renderer2遥赚。】

2.Renderer2

<div style="width:100px;height:100px;border:1px solid red" class="btn1">按鈕一</div>
<p>了解ElementRef</p>

修改我們的js如下

import {ElementRef,OnInit,Renderer2} from '@angular/core';
  constructor( 
    private el:ElementRef,
    private renderer2: Renderer2){}
  ngOnInit(){
    console.log(this.el.nativeElement);
    //this.el.nativeElement.querySelector('.btn1').style.height = '300px';
    this.renderer2.setStyle(this.el.nativeElement.querySelector('.btn1'),'background','green')
  }
image.png

關(guān)于Renderer2的更多API:

abstract class Renderer2 {
  abstract get data: {...}
  destroyNode: ((node: any) => void) | null
  abstract destroy(): void
  abstract createElement(name: string, namespace?: string | null): any
  abstract createComment(value: string): any
  abstract createText(value: string): any
  abstract appendChild(parent: any, newChild: any): void
  abstract insertBefore(parent: any, newChild: any, refChild: any): void
  abstract removeChild(parent: any, oldChild: any): void
  abstract selectRootElement(selectorOrNode: string | any): any
  abstract parentNode(node: any): any
  abstract nextSibling(node: any): any
  abstract setAttribute(el: any, name: string, value: string, namespace?: string | null): void
  abstract removeAttribute(el: any, name: string, namespace?: string | null): void
  abstract addClass(el: any, name: string): void
  abstract removeClass(el: any, name: string): void
  abstract setStyle(el: any, style: string, value: any, flags?: RendererStyleFlags2): void
  abstract removeStyle(el: any, style: string, flags?: RendererStyleFlags2): void
  abstract setProperty(el: any, name: string, value: any): void
  abstract setValue(node: any, value: string): void
  abstract listen(target: 'window' | 'document' | 'body' | any, eventName: string, callback: (event: any) => boolean | void): () => void
}

詳細(xì)官網(wǎng)鏈接

3.ViewChild(屬性裝飾器)

可以使用ViewChild從視圖DOM中獲取匹配選擇器的第一個(gè)元素或指令阐肤。如果視圖DOM發(fā)生變化凫佛,并且新的子項(xiàng)與選擇器匹配,則屬性將被更新泽腮。在ngAfterViewInit調(diào)用回調(diào)之前設(shè)置御蒲。

可以根據(jù)模板引用變量獲取DOM

直接上代碼吧:

<div style="width:100px;height:100px;border:1px solid red" class="btn1">按鈕一</div>
<!--模板變量名-->
<div style="width:100px;height:100px;" #div3>按鈕三</div>
<p>了解ElementRef</p>
import { ElementRef,OnInit,Renderer2,ViewChild} from '@angular/core';
  @ViewChild('div3') div3:ElementRef;
  constructor( 
    private el:ElementRef,
    private renderer2: Renderer2){}
  ngOnInit(){
    console.log(this.el.nativeElement);
    //this.el.nativeElement.querySelector('.btn1').style.height = '300px';
    this.renderer2.setStyle(this.el.nativeElement.querySelector('.btn1'),'background','green');
    console.log('ViewChild獲取匹配的元素:')
    console.log(this.div3.nativeElement);
    this.renderer2.setStyle(this.div3.nativeElement,'background','red');
  }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市诊赊,隨后出現(xiàn)的幾起案子厚满,更是在濱河造成了極大的恐慌,老刑警劉巖碧磅,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碘箍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡鲸郊,警方通過(guò)查閱死者的電腦和手機(jī)丰榴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)秆撮,“玉大人四濒,你說(shuō)我怎么就攤上這事≈氨妫” “怎么了盗蟆?”我有些...
    開(kāi)封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)舒裤。 經(jīng)常有香客問(wèn)我喳资,道長(zhǎng),這世上最難降的妖魔是什么腾供? 我笑而不...
    開(kāi)封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任仆邓,我火速辦了婚禮鲜滩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘节值。我一直安慰自己徙硅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布察署。 她就那樣靜靜地躺著闷游,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贴汪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天休吠,我揣著相機(jī)與錄音扳埂,去河邊找鬼。 笑死瘤礁,一個(gè)胖子當(dāng)著我的面吹牛阳懂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播柜思,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼岩调,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了赡盘?” 一聲冷哼從身側(cè)響起号枕,我...
    開(kāi)封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎陨享,沒(méi)想到半個(gè)月后葱淳,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抛姑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年赞厕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片定硝。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡皿桑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蔬啡,到底是詐尸還是另有隱情诲侮,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布星爪,位于F島的核電站浆西,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏顽腾。R本人自食惡果不足惜近零,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一诺核、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧久信,春花似錦窖杀、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至腿椎,卻和暖如春桌硫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背啃炸。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工铆隘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人南用。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓膀钠,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親裹虫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肿嘲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 一:什么是閉包?閉包的用處筑公? (1)閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)雳窟。在本質(zhì)上,閉包就 是將函數(shù)內(nèi)部和函數(shù)外...
    xuguibin閱讀 9,536評(píng)論 1 52
  • jQuery jQuery是JavaScript世界中使用最廣泛的一個(gè)庫(kù)十酣。 jQuery這么流行涩拙,肯定是因?yàn)樗鉀Q...
    星騰_范特西閱讀 2,085評(píng)論 0 27
  • 有時(shí)不得不面對(duì)一些需要在組件中直接操作DOM的情況,如我們的組件中存在大量的CheckBox耸采,我們想獲取到被選中的...
    阿踏閱讀 1,168評(píng)論 0 1
  • AngularJS AngularJS概述 介紹 簡(jiǎn)稱:ng Angular是一個(gè)MVC框架 其他前端框架: Vu...
    我愛(ài)開(kāi)發(fā)閱讀 2,333評(píng)論 0 8
  • core package 概要:Core是所有其他包的基礎(chǔ)包.它提供了大部分功能包括metadata兴泥,templa...
    LOVE小狼閱讀 2,559評(píng)論 0 3