Angular2學習筆記-組件中的DOM操作

有時不得不面對一些需要在組件中直接操作DOM的情況稚茅,如我們的組件中存在大量的CheckBox,我們想獲取到被選中的CheckBox平斩,然而這些CheckBox是通過循環(huán)產(chǎn)生的亚享,我們無法給每一個CheckBox指定一個ID,這個時候可以通過操作DOM來實現(xiàn)绘面。angular API中包含有viewChild欺税,contentChild等修飾符,這些修飾符可以返回模板中的DOM元素揭璃。

指令中的DOM操作

@Directive({
    selector: 'p'
})
export class TodoDirective{
    constructor(el: ElementRef, renderer: Renderer){
        renderer.setElementStyle(el.nativeElement, 'backgroundColor', 'red');
    }
}

以上聲明了一個指令晚凿,使用是需要在module中的declarations中聲明。該指令的作用是將p元素的backgroundColor設置為red瘦馍。
-ElementRef是一個允許直接獲取DOM元素的一個類歼秽,該類包含一個nativeElement屬性。當不允許直接操作原生DOM元素時情组,該屬性值為null燥筷。
-Renderer該類包含大量可以用來操作DOM原生的方法。

@ViewChild和@ViewChildren

每一個組件都有一個視圖模板院崇,通過 template或templateUrl引入肆氓。想要獲取視圖模板中的DOM元素則可以使用@ViewChild和@ViewChildren修飾符。他們可以接受模板變量或元素標簽或模板類名來獲取DOM節(jié)點底瓣。@ViewChild返回ElementRef類引用(獲取組件時則直接使用組件類名)谢揪,而@ViewChildren返回QueryList<ElementRef>。

//模板內(nèi)容
<p *ngFor='let item of todos' #name>{{ item.name }}</p>

//組件中獲取DOM
@ViewChildren('name')
todoNames: QueryList<ElementRef>;

@ViewChild('name')
todoName: ElementRef;
ngAfterViewInit(){
    this.todoNames.forEach(e=>console.log(e.nativeElement.innerText));
    console.log(this.todoName.nativeElement.innerText);
}

@ViewChild('name')和@ViewChildren('name')通過name模板變量獲取p標簽DOM節(jié)點,可以在ngAfterViewInit聲明周期鉤子中獲取節(jié)點信息键耕,當然也可以在其他函數(shù)中寺滚,只要保證視圖完成初始化即可柑营。

QueryList是一個不可變的列表屈雄,其存在一個名為changes的Observable變量,因此可以被訂閱官套,結合notifyOnChanges方法酒奶,可以實時查看QueryList中變量的變化。調用notifyOnChanges函數(shù)后奶赔,當組件的輸入發(fā)生變化時會觸發(fā)Observable發(fā)出新的值惋嚎,這樣當todoNames: QueryList<ElementRef>有更新時,便能通過下面代碼查看到變化:

this.todoNames.changes.subscribe(data => data._results.forEach(
    e=>console.log(e.nativeElement.innerText)));
this.todoNames.notifyOnChanges();

@ContentChild和@ContentChildren

看著與@ViewChild和@ViewChildren很相似站刑,但@ContentChild和@ContentChildren是獲取組件標簽中的內(nèi)容的另伍,懶得寫例子,這里直接貼上angular中文官網(wǎng)的一個例子:

import {Component, ContentChildren, Directive, Input, QueryList} from '@angular/core';
@Directive({selector: 'pane'})
export class Pane {
  @Input() id: string;
}
@Component({
  selector: 'tab',
  template: `
    <div>panes: {{serializedPanes}}</div> 
  `
})
export class Tab {
  @ContentChildren(Pane) panes: QueryList<Pane>;
  get serializedPanes(): string { return this.panes ? this.panes.map(p => p.id).join(', ') : ''; }
}
@Component({
  selector: 'example-app',
  template: `
    <tab>
      <pane id="1"></pane>
      <pane id="2"></pane>
      <pane id="3" *ngIf="shouldShow"></pane>
    </tab>
    <button (click)="show()">Show 3</button>
  `,
})
export class ContentChildrenComp {
  shouldShow = false;
  show() { this.shouldShow = true; }
}

可以看出@ContentChildren(Pane) panes: QueryList<Pane>;獲取的是組件Tab中的內(nèi)容:

 <tab>
      <pane id="1"></pane>
      <pane id="2"></pane>
      <pane id="3" *ngIf="shouldShow"></pane>
 </tab>

與@ViewChild類似@ContentChild獲取的是第一個Pane指令绞旅,獲取DOM元素后摆尝,可以采用類似的方式處理。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末因悲,一起剝皮案震驚了整個濱河市堕汞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晃琳,老刑警劉巖讯检,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異卫旱,居然都是意外死亡人灼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門顾翼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來投放,“玉大人,你說我怎么就攤上這事暴构」虺剩” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵取逾,是天一觀的道長耗绿。 經(jīng)常有香客問我,道長砾隅,這世上最難降的妖魔是什么误阻? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上究反,老公的妹妹穿的比我還像新娘寻定。我一直安慰自己,他們只是感情好精耐,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布狼速。 她就那樣靜靜地躺著,像睡著了一般卦停。 火紅的嫁衣襯著肌膚如雪向胡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天惊完,我揣著相機與錄音僵芹,去河邊找鬼。 笑死小槐,一個胖子當著我的面吹牛拇派,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凿跳,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼件豌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拄显?” 一聲冷哼從身側響起苟径,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎躬审,沒想到半個月后棘街,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡承边,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年遭殉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片博助。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡险污,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出富岳,到底是詐尸還是另有隱情蛔糯,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布窖式,位于F島的核電站蚁飒,受9級特大地震影響,放射性物質發(fā)生泄漏萝喘。R本人自食惡果不足惜淮逻,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一琼懊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧爬早,春花似錦哼丈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至脑漫,卻和暖如春髓抑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背优幸。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留褪猛,地道東北人网杆。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像伊滋,于是被迫代替她去往敵國和親碳却。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

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

  • 指令定義 對于指令笑旺,可以把它簡單的理解成在特定DOM元素上運行的函數(shù)昼浦,指令可以擴展這個元素的功能。??我們可以自己...
    oWSQo閱讀 1,185評論 0 0
  • 組件基礎 組件用來包裝特定的功能筒主,應用程序的有序運行依賴于組件之間的協(xié)同工作关噪。組件是angular應用的最小邏輯單...
    oWSQo閱讀 1,368評論 0 0
  • AngularJS是什么?AngularJs(后面就簡稱ng了)是一個用于設計動態(tài)web應用的結構框架乌妙。首先使兔,它是...
    200813閱讀 1,592評論 0 3
  • 你想干嘛?藤韵!偷東西虐沥?!一個戴眼鏡的年輕人男人大叫泽艘。 順著男人的目光欲险,所有人的目光都集中到了這個帶著帽子的中...
    藏之不借閱讀 431評論 1 1
  • 親愛的寶貝,時間過得好快匹涮,一轉眼天试,今天是你正式進入小學的第十一天,也是媽媽第一次參加你小學一年級的家長會焕盟,也是媽媽...
    a慈閱讀 456評論 0 0