淺析Angular 實(shí)現(xiàn)一個(gè)repeat指令的方法
在項(xiàng)目中常常會(huì)使用 ngFor指令,之前只會(huì)使用它,具體如何實(shí)現(xiàn)的卻不得而知。終于這幾天有時(shí)間"研究"了下它是如何實(shí)現(xiàn)的,順便自己寫個(gè)簡(jiǎn)單的 ngFor指令:repeat
說(shuō)到指令就不得不提一下TemplateRef和ViewContainerRef
TemplateRef 可以理解為dom渲染模板,指令通過(guò)TemplateRef的模板來(lái)創(chuàng)建dom元素
ViewContainerRef 可以理解為TemplateRef的容器,在調(diào)用ViewContainerRef上的createEmbeddedView時(shí),傳入TemplateRef和context就能創(chuàng)建出dom元素 此外還需要說(shuō)明的是Angular的微語(yǔ)法,詳見下圖。
Angular會(huì)把微語(yǔ)法展開成ng-template的形式,支持傳入?yún)?shù), TemplateRef
所關(guān)聯(lián)的則是ng-template內(nèi)的內(nèi)容,let variable則是聲明變量,如果后面沒有賦值操作,則這個(gè)變量取默認(rèn)值。這里取值和createEmbeddedView方法的context相關(guān)(后面會(huì)細(xì)說(shuō))。
代碼示例:
import { Directive, Input, TemplateRef, ViewContainerRef } from "@angular/core";
@Directive({
selector: "[appRepeat]"
})
export class RepeatDirective {
constructor(private tpl: TemplateRef<any>, private vc: ViewContainerRef) {}
@Input() set appRepeatIn(val: Array<any>) {
val.forEach((item, index) => {
this.vc.createEmbeddedView(this.tpl, {
$implicit: item,
index: index,
even: index % 2 === 0,
odd: index % 2 === 1
});
});
}
}
<ul>
<li
*appRepeat="
let item;
in: items;
let index = index;
let even = even;
let odd = odd;
let defualt
"
>
<ul class="{{ even ? 'even' : 'odd' }}">
<li>index: {{ index }}</li>
<li>item: {{ item }}</li>
<li>default: {{ defualt }}</li>
<li>even: {{ even }}</li>
<li>odd: {{ odd }}</li>
</ul>
</li>
</ul>
通過(guò)上面的代碼可以知道:
let 聲明變量(index,even,odd)可以使用createEmbeddedView方法傳入context 的屬性值(index,even,odd)進(jìn)行賦值,如果只聲明了變量并無(wú)賦值操作,則會(huì)使用context的屬性值($implicit)進(jìn)行賦值。
keyExp 為 Directive 聲明Input屬性,Directive的Input屬性名格式為"[selector]key",遵循CamelCase命名規(guī)則,例如上面的例子:
selector: "appRepeat"
key: "in"
則命名為:"appRepeatIn"。
Directive 可以通過(guò)Input傳入的數(shù)據(jù)來(lái)進(jìn)行創(chuàng)建頁(yè)面視圖
總結(jié):通過(guò)本文可以知道在Angular中如何創(chuàng)建一個(gè)簡(jiǎn)單的結(jié)構(gòu)指令,指令展開的微語(yǔ)法(展開形式,傳入數(shù)據(jù),賦值操作),使用createEmbeddedView和TemplateRef來(lái)創(chuàng)建dom元素。如有疑問(wèn),可以查看源代碼 或者在下面留言~
以上所述是小編給大家介紹的Angular 實(shí)現(xiàn)一個(gè)repeat指令的方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言小編會(huì)及時(shí)回復(fù)大家的!
- AngularJS ng-repeat指令及Ajax的應(yīng)用實(shí)例分析
- AngularJS ng-repeat指令中使用track by子語(yǔ)句解決重復(fù)數(shù)據(jù)遍歷錯(cuò)誤問(wèn)題
- AngularJs中 ng-repeat指令中實(shí)現(xiàn)含有自定義指令的動(dòng)態(tài)html的方法
- Angularjs通過(guò)指令監(jiān)聽ng-repeat渲染完成后執(zhí)行腳本的方法
- AngularJS使用自定義指令替代ng-repeat的方法
- AngularJS使用ng-repeat指令實(shí)現(xiàn)下拉框
- AngularJS基礎(chǔ) ng-repeat 指令簡(jiǎn)單示例
- AngularJS入門(用ng-repeat指令實(shí)現(xiàn)循環(huán)輸出
- AngularJS學(xué)習(xí)筆記之基本指令(init、repeat)
相關(guān)文章
Angular使用ControlValueAccessor創(chuàng)建自定義表單控件
這篇文章主要介紹了Angular使用ControlValueAccessor創(chuàng)建自定義表單控件,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03
Angular.JS利用ng-disabled屬性和ng-model實(shí)現(xiàn)禁用button效果
這篇文章主要介紹了Angular.JS利用ng-disabled屬性和ng-model實(shí)現(xiàn)禁用button效果的相關(guān)資料,文中給出了詳細(xì)的示例代碼,相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-04-04
Angular限制input框輸入金額(是小數(shù)的話只保留兩位小數(shù)點(diǎn))
最近做項(xiàng)目遇到這樣的需求輸入框要求輸入金額,只能輸入數(shù)字,可以是小數(shù),必須保留小數(shù)點(diǎn)后兩位。下面分為兩部分代碼給大家介紹實(shí)現(xiàn)代碼,需要的的朋友參考下吧2017-07-07
AngularJs入門教程之環(huán)境搭建+創(chuàng)建應(yīng)用示例
這篇文章主要介紹了AngularJs入門教程之環(huán)境搭建+創(chuàng)建應(yīng)用的方法,較為詳細(xì)的分析了AngularJS的功能、下載及應(yīng)用創(chuàng)建方法,需要的朋友可以參考下2016-11-11
Angular實(shí)現(xiàn)搜索框及價(jià)格上下限功能
這篇文章主要為大家詳細(xì)介紹了Angular實(shí)現(xiàn)搜索框及價(jià)格上下限功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
angularJS 發(fā)起$http.post和$http.get請(qǐng)求的實(shí)現(xiàn)方法
本篇文章主要介紹了angularJS 發(fā)起$http.post和$http.get請(qǐng)求的實(shí)現(xiàn)方法,分別介紹了$http.post和$http.get請(qǐng)求的方法,有興趣的可以了解一下2017-05-05
Angular使用動(dòng)態(tài)加載組件方法實(shí)現(xiàn)Dialog的示例
這篇文章主要介紹了Angular使用動(dòng)態(tài)加載組件方法實(shí)現(xiàn)Dialog的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
詳解angular臟檢查原理及偽代碼實(shí)現(xiàn)
這篇文章主要介紹了詳解angular臟檢查原理及偽代碼實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06

