AngularJS 模板語(yǔ)法

模板語(yǔ)法

模板生成流程圖

模板是編寫(xiě) Angular 組件最重要的一環(huán),你至少需要深入理解以下知識(shí)點(diǎn)才能玩轉(zhuǎn) Angular 模板:

  1. 對(duì)比各種 JS 模板引擎的設(shè)計(jì)思路
  2. Mustache(八字胡)語(yǔ)法肿轨, {}
  3. 模板內(nèi)的局部變量
  4. 屬性綁定掘宪、事件綁定战惊、雙向綁定
  5. 在模板里面使用結(jié)構(gòu)型指令 ngIf条辟、ngFor精盅、ngSwitch
  6. 在模板里面使用屬性型指令 NgClass媒熊、NgStyle奇适、NgModel
  7. 在模板里面使用管道格式化數(shù)據(jù)

對(duì)比各種 JS 模板引擎的設(shè)計(jì)思路

什么是模板引擎? 是指利用某種模板語(yǔ)言將頁(yè)面制成模板芦鳍,再依據(jù)業(yè)務(wù)邏輯將該模板語(yǔ)言翻譯成業(yè)務(wù)數(shù)據(jù)嚷往,從而生成最終展示頁(yè)面。 簡(jiǎn)單的講就是根據(jù)靜態(tài)HTMl元素和業(yè)務(wù)邏輯處理的數(shù)據(jù)結(jié)合渲染生成瀏覽器器需要的頁(yè)面柠衅。

  • jQuery -> Handlebars
  • React -> jsx 模板寫(xiě)法
  • Angular -> 與“指令”緊密結(jié)合的模板語(yǔ)法 (vue 也是一樣)

各種模板引擎的唯一目標(biāo)就是提高開(kāi)發(fā)效率皮仁、縮短時(shí)間成本。綜合來(lái)說(shuō)茄茁,無(wú)論是哪一種前端模板魂贬,大家都比較推崇“輕邏輯”( logic-less )的設(shè)計(jì)思路。

何為“輕邏輯”? 簡(jiǎn)而言之裙顽,所謂“輕邏輯”就是說(shuō)付燥,你不能在模板里面編寫(xiě)非常復(fù)雜的 JavaScript 表達(dá)式。比如愈犹,Angular 的模板語(yǔ)法就有規(guī)定:

  • 你不能在模板里面 new 對(duì)象
  • 不能使用=键科、+=、-=這類(lèi)的表達(dá)式
  • 不能用++漩怎、--運(yùn)算符
  • 不能使用位運(yùn)算符

為什么要“輕邏輯”勋颖?

  1. 本身的 Html 是不識(shí)別 if 、for 等操作的勋锤;模板引擎處于的地位就是幫忙編譯轉(zhuǎn)換純HTMl元素饭玲。
  2. 在 HTML 加入復(fù)雜的邏輯,會(huì)加大模板引擎編譯的時(shí)間和計(jì)算能力叁执;而且也不建議復(fù)雜邏輯處理放到HTMl里來(lái)做茄厘,保證 HTML 的單一純潔性;使用模板也是來(lái)做簡(jiǎn)單的插值相關(guān)的操作
  3. JS 版的編譯器需要在瀏覽器里面運(yùn)行谈宛,搞得太復(fù)雜瀏覽器拖不動(dòng)次哈!
  4. 最根本還是模板引擎不夠強(qiáng), 并不是萬(wàn)能的;

對(duì)于 Angular 來(lái)說(shuō)吆录,強(qiáng)調(diào)“輕邏輯”還有另一個(gè)原因:在組件的整個(gè)生命周期里面窑滞,模板函數(shù)會(huì)被執(zhí)行很多次。你可以想象, Angular 每次要刷新組件的外觀的時(shí)候哀卫,都需要去調(diào)用一下模板函數(shù)巨坊,如果你在模板里面編寫(xiě)了非常復(fù)雜的代碼,一定會(huì)增加渲染時(shí)間聊训,用戶(hù)一定會(huì)感到界面有“卡頓”抱究。

人眼的視覺(jué)延遲大約是100ms到400ms之間恢氯,如果整個(gè)頁(yè)面的渲染時(shí)間超過(guò)400ms带斑,界面基本上就卡得沒(méi)法用了。有一些做游戲的開(kāi)發(fā)者會(huì)追求60fps刷新率的細(xì)膩感覺(jué)勋拟,60分之1秒約等于16.7ms勋磕,如果 UI 整體的渲染時(shí)間超過(guò)了16.7ms,就沒(méi)法達(dá)到這個(gè)要求了敢靡。

輕邏輯( logic-less )帶來(lái)了效率的提升挂滓,也帶來(lái)了一些不方便,比如很多模板引擎都實(shí)現(xiàn)了 if 語(yǔ)句啸胧,但是沒(méi)有實(shí)現(xiàn) else赶站,所以開(kāi)發(fā)者們?cè)诰帉?xiě)復(fù)雜業(yè)務(wù)邏輯的時(shí)候模板代碼會(huì)顯得非常啰嗦。

目前來(lái)說(shuō)纺念,并沒(méi)有完美的方案能同時(shí)兼顧運(yùn)行效率和語(yǔ)法表現(xiàn)能力贝椿,這里只能取一個(gè)平衡。

Mustache 語(yǔ)法

Mustache 語(yǔ)法也就是你們說(shuō)的雙花括號(hào)語(yǔ)法{{...}}陷谱。

關(guān)于 Mustache 語(yǔ)法烙博,你需要掌握3點(diǎn):

  1. 它可以獲取到組件里面定義的屬性值。
  2. 它可以自動(dòng)計(jì)算簡(jiǎn)單的數(shù)學(xué)表達(dá)式烟逊,例如:加減乘除渣窜、取模
  3. 它可以獲得方法的返回值。

插值語(yǔ)法關(guān)鍵代碼實(shí)例:

<h3>
    歡迎來(lái)到{{title}}宪躯!
</h3>
public title = 'Mustache 語(yǔ)法';

簡(jiǎn)單的數(shù)學(xué)表達(dá)式求值:

<p>1 + 5 = {{ 1 + 5 }}</p>

調(diào)用組件里面定義的方法:

<p> {{ getStr() }} </p>
public getStr(): string {
    return '調(diào)用方法乔宿!'
}

屬性綁定([屬性名])

屬性綁定是用方括號(hào)來(lái)做的,寫(xiě)法:

<img [src]="imgSrc" />
<button [disabled]="isUnchanged">是否禁用</button>
public imgSrc:string = './images.png';
public isUnchanged:boolean = true;

很明顯访雪,這種綁定是單向數(shù)據(jù)綁定详瑞,單一的讀取值而已。

事件綁定 ( (事件名) )

事件綁定是用圓括號(hào)來(lái)做的冬阳,寫(xiě)法:

<button (click)="btnClick($event)">點(diǎn)擊事件</button>
pubic btnClick(e):void {
    alert('點(diǎn)擊事件測(cè)試~');
}

雙向綁定 ( [(...)] )

你經(jīng)常需要顯示數(shù)據(jù)屬性蛤虐,并在用戶(hù)作出更改時(shí)更新該屬性。

在元素層面上肝陪,既要設(shè)置元素屬性驳庭,又要監(jiān)聽(tīng)元素事件變化。

雙向綁定是通過(guò)方括號(hào)里面套一個(gè)圓括號(hào) [(...)] 來(lái)做的,模板寫(xiě)法:

<app-sizer [(size)]="fontSizePx"></app-sizer>
public fontSizePx:number = 14;

模板內(nèi)的局部變量

在模板里面使用結(jié)構(gòu)型指令

Angular 有3個(gè)內(nèi)置的結(jié)構(gòu)型指令:*ngIf饲常、*ngFor蹲堂、ngSwitchngSwitch 的語(yǔ)法比較啰嗦贝淤,使用頻率小一些, 了解就好柒竞。

*ngIf 代碼實(shí)例:

<p *ngIf="isShow">顯示還是不顯示?</p>
<button (click)="toggleShow()">控制顯示隱藏</button>
public isShow:boolean=true;

public toggleShow():void {
    this.isShow = !this.isShow;
}

*ngFor 代碼實(shí)例:

<ul>
    <li *ngFor="let item of items; let i = index;">
        {{i+1}} - {{ item.name }}
    </li>
</ul>
public items:Array<any>=[
    {name:"PyCoder"},
    {name:"Jun ting"},
    {name:"EcmaScript"}
];

*ngSwitch 代碼實(shí)例:

<div [ngSwitch]="mapStatus">
    <p *ngSwitchCase="0">下載中...</p>
    <p *ngSwitchCase="1">正在讀取...</p>
    <p *ngSwitchDefault>系統(tǒng)繁忙...</p>
</div>
public mapStatus:number = 1;

特別注意:一個(gè) HTML 標(biāo)簽上只能同時(shí)使用一個(gè)結(jié)構(gòu)型的指令播聪。

因?yàn)椤敖Y(jié)構(gòu)型”指令會(huì)修改 DOM 結(jié)構(gòu)朽基,如果在一個(gè)標(biāo)簽上使用多個(gè)結(jié)構(gòu)型指令,大家都一起去修改 DOM 結(jié)構(gòu)离陶,到時(shí)候到底誰(shuí)說(shuō)了算稼虎?

那么需要在同一個(gè) HTML 上使用多個(gè)結(jié)構(gòu)型指令應(yīng)該怎么辦呢?有兩個(gè)辦法:

  • 加一層空的 div 標(biāo)簽進(jìn)行包裹
  • 加一層 <ng-container>

在模板里面使用屬性型指令

使用頻率比較高的3個(gè)內(nèi)置指令是:NgClass招刨、NgStyle霎俩、NgModel

NgClass 使用案例代碼:

<div [ngClass]="currentClasses">同時(shí)批量設(shè)置多個(gè)樣式</div>
<button (click)="setCurrentClasses()">設(shè)置</button>
public currentClasses: [];

public canSave: boolean = true;
public isUnchanged: boolean = true;
public isSpecial: boolean = true;

public setCurrentClasses ():void {
    this.currentClasses = {
        'saveable': this.canSave,
        'modified': this.isUnchanged,
        'special': this.isSpecial
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末沉眶,一起剝皮案震驚了整個(gè)濱河市打却,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谎倔,老刑警劉巖柳击,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異传藏,居然都是意外死亡腻暮,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)毯侦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)哭靖,“玉大人,你說(shuō)我怎么就攤上這事侈离∈杂模” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵卦碾,是天一觀的道長(zhǎng)铺坞。 經(jīng)常有香客問(wèn)我,道長(zhǎng)洲胖,這世上最難降的妖魔是什么济榨? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮绿映,結(jié)果婚禮上擒滑,老公的妹妹穿的比我還像新娘腐晾。我一直安慰自己,他們只是感情好丐一,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布藻糖。 她就那樣靜靜地躺著,像睡著了一般库车。 火紅的嫁衣襯著肌膚如雪巨柒。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,598評(píng)論 1 305
  • 那天柠衍,我揣著相機(jī)與錄音洋满,去河邊找鬼。 笑死拧略,一個(gè)胖子當(dāng)著我的面吹牛芦岂,可吹牛的內(nèi)容都是我干的瘪弓。 我是一名探鬼主播垫蛆,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼腺怯!你這毒婦竟也來(lái)了袱饭?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤呛占,失蹤者是張志新(化名)和其女友劉穎虑乖,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體晾虑,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疹味,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了帜篇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糙捺。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖笙隙,靈堂內(nèi)的尸體忽然破棺而出洪灯,到底是詐尸還是另有隱情,我是刑警寧澤竟痰,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布签钩,位于F島的核電站,受9級(jí)特大地震影響坏快,放射性物質(zhì)發(fā)生泄漏铅檩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一莽鸿、第九天 我趴在偏房一處隱蔽的房頂上張望昧旨。 院中可真熱鬧,春花似錦、人聲如沸臼予。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)粘拾。三九已至窄锅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缰雇,已是汗流浹背入偷。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留械哟,地道東北人疏之。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像暇咆,于是被迫代替她去往敵國(guó)和親锋爪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

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