ElementRef & TemplateRef & ViewContainerRef

今天在做ng項(xiàng)目,看著前人的代碼有 viewChild() 等關(guān)鍵字破喻。新手有點(diǎn)疑惑擎场,索性查查資料總結(jié)一下和ng相關(guān)的幾個(gè)和DOM相關(guān)的幾個(gè)概念

ElementRef

由于ng是跨平臺的為了減少視圖層和渲染層的耦合也為了讓ng更適應(yīng)多平臺迅办,ng幫我們封裝了ElementRef,我們可以通過ElementRef拿到native元素(在瀏覽器中也就是我們常說的DOM元素)

下面我們看一段代碼

    import { Component, ElementRef, AfterViewInit }  from '@angular/core';
    @Component ({
          selector:'my-app',
          template:`
              <div #greet>Hello  哇牛!</div>
          `
    })
    export class AppComponent(){
          @ViewChild('greet')  greetDiv: ElementRef

          construcor(private elementRef: ElementRef, private renderer: Renderer)  {
    
          }
          ngAfterViewInit() {
              // 1: 這一種可以減少耦合贾虽,并且做到跨平臺
              this.renderer.setElementStyle(this.greetDiv.nativeElement, 'backgroundColor',red)
            //   2: 這一種寫法不提倡
            this.greetDiv.nativeElement.backgroundColor='red'
          }
    }

TemplateRef && ViewContainerRef

template本身是HTML的標(biāo)簽菇肃,用于保存客戶端的內(nèi)容機(jī)制蟆技,該內(nèi)容在頁面渲染時(shí)不被加載,但是可以在運(yùn)行時(shí)被javascript解析,詳情可以看 Template HTML
TemplateRef

    // @angular/core/src/linker/template_ref.d.ts
    // 用于表示內(nèi)嵌的template模板,能夠用于創(chuàng)建內(nèi)嵌視(EmbeddedViews)
    export declare abstract class TemplateRef<C> {
        elementRef: ElementRef;
        abstract createEmbeddedView(context: C): EmbeddedViewRef<C>;
    }

templateRef 下面有個(gè)抽象方法妻坝,不能直接實(shí)例化抽象類應(yīng)該實(shí)例抽象化類的子類刽宪,每個(gè)實(shí)例都具有createEmbeddedView方法

ViewContainerRef

import { Component, TemplateRef, ViewChild, ViewContainerRef, AfterViewInit } from '@angular/core';

@Component({
  selector: 'my-app',
  template: `
    <h1>Welcome to Angular World</h1>
    <template #tpl>
      <span>I am span in template</span>
    </template>
  `,
})
export class AppComponent {
  name: string = 'Semlinker';

  @ViewChild('tpl')
  tplRef: TemplateRef<any>;

  @ViewChild('tpl', { read: ViewContainerRef })
  tplVcRef: ViewContainerRef;

  ngAfterViewInit() {
    // console.dir(this.tplVcRef); (1)
    this.tplVcRef.createEmbeddedView(this.tplRef);
  }
}

TemplateRef:用于表示內(nèi)嵌的 template 模板元素庇谆,通過 TemplateRef 實(shí)例串述,我們可以方便創(chuàng)建內(nèi)嵌視圖(Embedded Views),且可以輕松地訪問到通過 ElementRef 封裝后的 nativeElement觅赊。需要注意的是組件視圖中的 template 模板元素茉兰,經(jīng)過渲染后會被替換成 comment 元素。

ViewContainerRef:用于表示一個(gè)視圖容器,可添加一個(gè)或多個(gè)視圖被因。通過 ViewContainer
Ref 實(shí)例,我們可以基于 TemplateRef 實(shí)例創(chuàng)建內(nèi)嵌視圖,并能指定內(nèi)嵌視圖的插入位置呻粹,也可以方便對視圖容器中已有的視圖進(jìn)行管理腮郊。簡而言之,ViewContainerRef 的主要作用是創(chuàng)建和管理內(nèi)嵌視圖或組件視圖踪少。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子凌埂,更是在濱河造成了極大的恐慌伏恐,老刑警劉巖横蜒,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澎蛛,死亡現(xiàn)場離奇詭異督勺,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門次氨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵阔馋,是天一觀的道長。 經(jīng)常有香客問我客蹋,道長辆琅,這世上最難降的妖魔是什么暇屋? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布鲤嫡。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天虐先,我揣著相機(jī)與錄音篮愉,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播膀跌,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼熄诡,長吁一口氣:“原來是場噩夢啊……” “哼苇本!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡斋荞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年柳刮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蚕甥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晌块。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出仁卷,到底是詐尸還是另有隱情充包,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布莺琳,位于F島的核電站辞做,受9級特大地震影響框喳,放射性物質(zhì)發(fā)生泄漏粪般。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧静秆,春花似錦抚笔、人聲如沸殊橙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谬莹。三九已至,卻和暖如春奔则,著一層夾襖步出監(jiān)牢的瞬間酬蹋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工抽莱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留除嘹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓岸蜗,卻偏偏與公主長得像尉咕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子璃岳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355

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

  • 這篇文章我們將介紹在 Angular 中如何動態(tài)創(chuàng)建組件年缎。 定義 AlertComponent 組件 首先,我們需...
    semlinker閱讀 1,604評論 0 5
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,822評論 6 342
  • AngularJS AngularJS概述 介紹 簡稱:ng Angular是一個(gè)MVC框架 其他前端框架: Vu...
    我愛開發(fā)閱讀 2,338評論 0 8
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,147評論 25 707
  • 媽媽铃慷,您是美麗的女人单芜!您給了我生命,又撫養(yǎng)我長大成人犁柜,我感謝您洲鸠! 在這世界上,不是生了孩子就是一個(gè)好媽媽的馋缅,有些...
    靜心專注閱讀 234評論 3 5