angular 模板語(yǔ)法

1.插值表達(dá)式 (Interpolation) {{...}}
<p>The sum of 1 + 1 is {{1 + 1}}</p>
2.表達(dá)式上下文 (Expression context)
{{title}}
<span [hidden]="isUnchanged">changed</span>

二.綁定語(yǔ)法

綁定的類型可以根據(jù)數(shù)據(jù)流的方向分成三類:

  • 從數(shù)據(jù)源到視圖(source-to-view)
  • 從視圖到數(shù)據(jù)源(view-to-source)
  • 雙向的從視圖到數(shù)據(jù)源再到視圖(view-to-source-to-view)。
單向 source-to-view

語(yǔ)法 綁定類型
{{expression}} 插值表達(dá)式
[target]="expression" / bind-target="expression" Property, Attribute 類樣式

單向 view-to-source

語(yǔ)法 綁定類型
(target)="statement" / on-target="statement" 事件

雙向

語(yǔ)法 綁定類型
[(target)]="expression" / bindon-target="expression" 雙向

綁定類型(插值表達(dá)式除外)有一個(gè)目標(biāo)名致板,它位于等號(hào)左邊辙培,它是 Property 的名字(注意它不是 Attribute 的名字)咸灿。

綁定目標(biāo) (Binding targets)

Property 綁定類型
目標(biāo) 范例
Element property <img [src]="heroImageUrl">
Component property <hero-detail [hero]="currentHero"></hero-detail>
Directive property <div [ngClass]="{special: isSpecial}"></div>
事件綁定類型
目標(biāo) 范例
Element event <button (click)="onSave()">Save</button>
Component event <hero-detail (deleteRequest)="deleteHero()"></hero-detail>
Directive event <div (myClick)="clicked=$event" clickable>click me</div>
雙向綁定類型
目標(biāo) 范例
Event and property <input [(ngModel)]="name">
Attribute 綁定類型
目標(biāo) 范例
Attribute(例外情況) <button [attr.aria-label]="help">help</button>
CSS 類綁定類型
目標(biāo) 范例
class property <div [class.special]="isSpecial">Special</div>
樣式綁定類型
目標(biāo) 范例
style property <button [style.color]="isSpecial ? 'red' : 'green'">
屬性綁定 (Property binding) [property]
<img [src]="heroImageUrl">

上例說明:image 元素的 src 屬性會(huì)被綁定到組件的 heroImageUrl 屬性上容劳。

綁定目標(biāo)

兩種寫法:

<img [src]="heroImageUrl">

![](heroImageUrl)

三.內(nèi)置指令

常見的內(nèi)置屬性型指令:

  • NgClass 添加或移除一組CSS類
  • NgStyle 添加或移除一組CSS樣式
  • NgModel 雙向綁定到 HTML 表單元素
NgClass

示例:組件方法 setCurrentClasses 可以把組件的屬性 currentClasses 設(shè)置為一個(gè)對(duì)象攻走,它將會(huì)根據(jù)三個(gè)其它組件的狀態(tài)為 true 或 false 而添加或移除三個(gè)類

currentClasses: {};
setCurrentClasses() {
  this.currentClasses =  {
    saveable: this.canSave,
    modified: !this.isUnchanged,
    special:  this.isSpecial
  };
}

把 ngClass 屬性綁定到 currentClasses,根據(jù)它來設(shè)置此元素的 CSS 類:

<div [ngClass]="currentClasses">This div is initially saveable, unchanged, and special</div>
NgStyle

ngStyle 需要綁定到一個(gè) key:value 控制對(duì)象宾抓。 對(duì)象的每個(gè) key 是樣式名抑月,它的 value 是能用于這個(gè)樣式的任何值树叽。

currentStyles: {};
setCurrentStyles() {
  // CSS styles: set per current state of component properties
  this.currentStyles = {
    'font-style':  this.canSave      ? 'italic' : 'normal',
    'font-weight': !this.isUnchanged ? 'bold'   : 'normal',
    'font-size':   this.isSpecial    ? '24px'   : '12px'
  };
}

<div [ngStyle]="currentStyles">
  This div is initially italic, normal weight, and extra large (24px).
</div>
NgModel

要使用 ngModel 需要導(dǎo)入 FormsModule 模塊。

import { NgModule } from '@angular/core';
import { BrowserModule }  from '@angular/platform-browser';
import { FormsModule } from '@angular/forms'; // <--- JavaScript import from Angular

/* Other imports */
@NgModule({
  imports: [
    BrowserModule,
    FormsModule  // <--- import into the NgModule
  ],
  /* Other module metadata */
})
export class AppModule { }

使用 ngModel 實(shí)現(xiàn)雙向數(shù)據(jù)綁定谦絮。

<input [(ngModel)]="currentHero.name">

該語(yǔ)句實(shí)際上隱藏了其實(shí)現(xiàn)細(xì)節(jié):

<input [ngModel]="currentHero.name"
       (ngModelChange)="currentHero.name=$event">

如果需要做一些不同的處理题诵,就不能使用 [(ngModel)] 語(yǔ)法,而應(yīng)寫成擴(kuò)展的方式:

<input [ngModel]="currentHero.name"
       (ngModelChange)="setUppercaseName($event)">

ngModel 指令只能用在支持 ControlValueAccessor 的元素上层皱。

四. 內(nèi)置結(jié)構(gòu)型指令

常見的內(nèi)置結(jié)構(gòu)型指令:

  • NgIf
  • NgFor
  • NgSwitch
NgIf
<hero-detail *ngIf="isActive"></hero-detail>

別忘了 ngIf 前面的星號(hào)( * )性锭。

NgFor
<div *ngFor="let hero of heroes">{{hero.name}}</div>
NgSwitch

NgSwitch 由三個(gè)指令組成:

  • 屬性型指令 NgSwitch
  • 結(jié)構(gòu)型指令 NgSwitchCase
  • 結(jié)構(gòu)型指令 NgSwitchDefault
<div [ngSwitch]="currentHero.emotion">
  <happy-hero    *ngSwitchCase="'happy'"    [hero]="currentHero"></happy-hero>
  <sad-hero      *ngSwitchCase="'sad'"      [hero]="currentHero"></sad-hero>
  <confused-hero *ngSwitchCase="'confused'" [hero]="currentHero"></confused-hero>
  <unknown-hero  *ngSwitchDefault           [hero]="currentHero"></unknown-hero>
</div>
模板引用變量

使用井號(hào) # (或 ref-)來聲明一個(gè)模板引用變量。The#phone declares a phone variable on an <input> element.

<input #phone placeholder="phone number">
或者寫成
<input ref-phone placeholder="phone number">
輸入輸出屬性 @Input 和 @Output
聲明輸入和輸出屬性(目標(biāo)屬性必須被顯式的標(biāo)記為輸入或輸出叫胖。)

HeroDetailComponent.hero 是屬性綁定的目標(biāo)草冈。 HeroDetailComponent.deleteRequest 是事件綁定的目標(biāo)。

<hero-detail [hero]="currentHero" (deleteRequest)="deleteHero($event)">
</hero-detail>

方法1:使用裝飾器 @Input() 和 @Output()瓮增。

@Input()  hero: Hero;
@Output() deleteRequest = new EventEmitter<Hero>();

方法2:通過元數(shù)據(jù)數(shù)組怎棱。

@Component({
  inputs: ['hero'],
  outputs: ['deleteRequest'],
})

兩種方法不可同時(shí)使用。

給輸入輸出屬性起別名

方法1:把別名傳進(jìn) @Input / @Output 裝飾器绷跑,就可以為屬性指定別名:

@Output('myClick') clicks = new EventEmitter<string>(); //  @Output(alias) propertyName = ...

方法2:在 inputs 和 outputs 數(shù)組中為屬性指定別名蹄殃。 語(yǔ)法(屬性名:別名)

@Directive({
  outputs: ['clicks:myClick']  // propertyName:alias
})

模板表達(dá)式操作符

管道操作符 |

管道是一個(gè)簡(jiǎn)單的函數(shù),它接受一個(gè)輸入值你踩,并返回轉(zhuǎn)換結(jié)果诅岩。

<div>Title through uppercase pipe: {{title | uppercase}}</div>

還能對(duì)管道使用參數(shù):

<div>Birthdate: {{currentHero?.birthdate | date:'longDate'}}</div>
安全導(dǎo)航操作符 ( ?. ) 和空屬性路徑

Angular 的安全導(dǎo)航操作符 (?.) 用來保護(hù)出現(xiàn)在屬性路徑中 null 和 undefined 值。示例:

The current hero's name is {{currentHero?.name}}

說明:當(dāng) currentHero 為空時(shí)带膜,保護(hù)視圖渲染器吩谦,讓它免于失敗。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末膝藕,一起剝皮案震驚了整個(gè)濱河市式廷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芭挽,老刑警劉巖滑废,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝗肪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蠕趁,警方通過查閱死者的電腦和手機(jī)薛闪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來俺陋,“玉大人豁延,你說我怎么就攤上這事±白矗” “怎么了诱咏?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)缴挖。 經(jīng)常有香客問我袋狞,道長(zhǎng),這世上最難降的妖魔是什么映屋? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任苟鸯,我火速辦了婚禮,結(jié)果婚禮上秧荆,老公的妹妹穿的比我還像新娘倔毙。我一直安慰自己埃仪,他們只是感情好乙濒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著卵蛉,像睡著了一般颁股。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上傻丝,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天甘有,我揣著相機(jī)與錄音,去河邊找鬼葡缰。 笑死亏掀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的泛释。 我是一名探鬼主播滤愕,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼怜校!你這毒婦竟也來了间影?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤茄茁,失蹤者是張志新(化名)和其女友劉穎魂贬,沒想到半個(gè)月后巩割,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡付燥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年宣谈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片机蔗。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蒲祈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出萝嘁,到底是詐尸還是另有隱情梆掸,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布牙言,位于F島的核電站酸钦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏咱枉。R本人自食惡果不足惜卑硫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蚕断。 院中可真熱鬧欢伏,春花似錦、人聲如沸亿乳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)葛假。三九已至障陶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間聊训,已是汗流浹背抱究。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留带斑,地道東北人鼓寺。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像勋磕,于是被迫代替她去往敵國(guó)和親妈候。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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