今天就跟大家聊聊有關(guān)angular10中怎么利用模板進行數(shù)據(jù)綁定,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
創(chuàng)新互聯(lián)專注于企業(yè)全網(wǎng)整合營銷推廣、網(wǎng)站重做改版、鞏留網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、H5技術(shù)、商城開發(fā)、集團公司官網(wǎng)建設、外貿(mào)營銷網(wǎng)站建設、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為鞏留等各大城市提供網(wǎng)站開發(fā)制作服務。
綁定語法歸納起來大概有三種(基礎(chǔ))
model => view (單向:插值、屬性綁定、樣式綁定)
view => model(單向:事件綁定)
view <=> model(雙向:ngModule)
【相關(guān)教程推薦:《angular教程》】
{{expression}} [target]="expression" bind-target="expression"{{ msg }}
// 插值表達式 // 屬性綁定// 組件通過屬性綁定的方式傳參 // 樣式綁定 Special// class綁定
HTML attribute 與 DOM property 的對比(很重要,加強理解)
理解 HTML 屬性和 DOM 屬性之間的區(qū)別,是了解 Angular 綁定如何工作的關(guān)鍵。Attribute 是由 HTML 定義的。Property 是從 DOM(文檔對象模型)節(jié)點訪問的
一些 HTML Attribute 可以 1:1 映射到 Property;例如,“ id”。
某些 HTML Attribute 沒有相應的 Property。例如,aria-* colSpan rowSpan。
某些 DOM Property 沒有相應的 Attribute。例如,textContent。
重要的是要記住,HTML Attribute 和 DOM Property 是不同的,就算它們具有相同的名稱也是如此。 在 Angular 中,HTML Attribute 的唯一作用是初始化元素和指令的狀態(tài)。
模板綁定使用的是 Property 和事件,而不是 Attribute。
編寫數(shù)據(jù)綁定時,你只是在和目標對象的 DOM Property 和事件打交道。
注意:
該通用規(guī)則可以幫助你建立 HTML Attribute 和 DOM Property 的思維模型: 屬性負責初始化 DOM 屬性,然后完工。Property 值可以改變;Attribute 值則不能。
此規(guī)則有一個例外。 可以通過 setAttribute() 來更改 Attribute,接著它會重新初始化相應的 DOM 屬性。
案例1:input
當瀏覽器渲染input時,它會創(chuàng)建一個對應的 DOM 節(jié)點,其 value Property 已初始化為 “Sarah”。
當用戶在 input 中輸入 Sally 時,DOM 元素的 value Property 將變?yōu)?Sally。 但是,如果使用 input.getAttribute('value')查看 HTML 的 Attribute value,則可以看到該 attribute 保持不變—— 它返回了 Sarah。
HTML 的 value 這個 attribute 指定了初始值;DOM 的 value 就是這個 property 是當前值。
案例2:禁用按鈕
disabled Attribute 是另一個例子。按鈕的 disabled Property 默認為 false,因此按鈕是啟用的。
當你添加 disabled Attribute 時,僅僅它的出現(xiàn)就將按鈕的 disabled Property 初始化成了 true,因此該按鈕就被禁用了。
Test Button
添加和刪除 disabled Attribute 會禁用和啟用該按鈕。 但是,Attribute 的值無關(guān)緊要,這就是為什么你不能通過編寫 仍被禁用 來啟用此按鈕的原因。
要控制按鈕的狀態(tài),請設置 disabled Property,
模版中除了綁定變量,還能綁定方法
模版中還可以寫些簡單的邏輯,比如判斷或運算
import { Component } from '@angular/core'; @Component({ selector: 'app-root', template: `變量綁定:{{ title }}
方法綁定:{{ getVal }}
方法綁定:{{ getVal2() }}
簡單運算 {{ 1 + 1 }}.
簡單運算 {{ price * 0.7 }}.
簡單運算:{{ gender === 0 ? '男':'女' }}
與方法結(jié)合 {{ price * 0.7 + getVal }}.
與方法結(jié)合 {{ price * 0.7 + getVal2() }}.
`, }) export class AppComponent { title = "模板綁定"; price = 30; gender = 0; get getVal(): number { //es6新語法,函數(shù)可以當做變量來使用 return 20; } getVal2(): number { return 33; } }
當使用模板表達式時,請遵循下列指南:
非常簡單
執(zhí)行迅速
沒有可見的副作用(即模版中的邏輯不能改變組件的變量)
綁定圖片
import { Component } from '@angular/core'; @Component({ selector: 'app-root', template: ` // 推薦 `, styles: [] }) export class AppComponent { madaoSrc = '../assets/images/madao.jpg'; }
綁定普通屬性
import { Component } from '@angular/core'; @Component({ selector: 'app-root', template: `
name | phone | age |
---|---|---|
張三 | 13398490594 | 33 |
李四 | // 注意colSpan和colspan15079049984 | 22 |
綁定自定義屬性
import { Component } from '@angular/core'; @Component({ selector: 'app-root', template: ` 一行文字 test title test title `, styles: [] }) export class AppComponent { madaoSrc = '../assets/images/madao.jpg'; customTitle = 'bbb'; }
使用插值表達式(不推薦)
插值也可以用于屬性,但常規(guī)做法還是用中括號[],建議整個項目保持風格統(tǒng)一
import { Component } from '@angular/core'; @Component({ selector: 'app-root', template: ` `, styles: [] }) export class AppComponent { madaoSrc = '../assets/images/madao.jpg'; user = { name: 'madao', pic: this.madaoSrc }; }
綁定單個樣式
import { Component } from '@angular/core'; @Component({ selector: 'app-root', template: `Primary secondary success danger danger //falsedanger //false `, styles: [] }) export class AppComponent { theme = 'primary'; isSuccess = true; }
綁定多個class
import { Component } from '@angular/core'; @Component({ selector: 'app-root', template: `btnCls btnCls2 btnCls3 btnCls btnCls2 btnCls3 `, styles: [] }) export class AppComponent { btnCls = 'btn btn-primary'; btnCls2 = ['btn', 'btn-success']; btnCls3 = { btn: true, 'btn-info': true }; }
綁定單個style
import { Component } from '@angular/core'; @Component({ selector: 'app-root', template: `一段文字
設置高度
設置高度
`, styles: [] }) export class AppComponent {}
綁定多個style
import { Component } from '@angular/core'; @Component({ selector: 'app-root', template: `style1
style2
style3
style3
`, styles: [] }) export class AppComponent { style1 = 'width: 200px;height: 50px;text-align: center;border: 1px solid;'; style2 = ['width', '200px', 'height', '50px', 'text-align', 'center', 'border', '1px solid']; // 有問題 style3 = { width: '200px', height: '50px', 'text-align': 'center', border: '1px solid' }; }
綁定優(yōu)先級
某個類或樣式綁定越具體,它的優(yōu)先級就越高
綁定總是優(yōu)先于靜態(tài)屬性
基本用法
import { Component } from '@angular/core'; @Component({ selector: 'app-root', template: `Primary `, styles: [] }) export class AppComponent { onClick() { console.log('onClick'); } }
事件對象
$event 就是原生的事件對象
import { Component } from '@angular/core'; @Component({ selector: 'app-root', template: `Primary `, styles: [] }) export class AppComponent { onClick(event: MouseEvent) { console.log('onClick', event.target); //直接用event.target.value會報錯,要用類型斷言 console.log((event.target as HTMLInputElement).value) } }
事件捕獲或事件冒泡
import { Component } from '@angular/core'; @Component({ selector: 'app-root', template: `//可以在html使用一些簡單的語法`, styles: [] }) export class AppComponent { parentClick() { console.log('parentClick'); } chilrenClick(event: MouseEvent) { event.stopPropagation(); //阻止事件冒泡 console.log('chilrenClick'); } }
輸入輸出屬性(主要是子傳父,通過自定義事件)
輸入屬性
子組件
import { Component, Input } from '@angular/core'; @Component({ selector: 'app-root', template: `Today's item: {{item}}
` }) export class ItemDetailComponent { @Input() item: string; }
父組件
import { Component } from '@angular/core'; @Component({ selector: 'app-root', template: ``, }) export class AppComponent { currentItem = 'Television'; }
輸出屬性
通過 new EventEmitter() 自定義一個事件;
調(diào)用 EventEmitter.emit(data) 發(fā)出事件,傳入數(shù)據(jù);
父指令通過監(jiān)聽自定義事件,并通過傳入的 $event 對象接收數(shù)據(jù)。
子組件
import { Component, Output, EventEmitter } from '@angular/core'; @Component({ selector: 'app-root', template: `Add to parent's list `, }) export class ItemOutputComponent { @Output() newItemEvent = new EventEmitter(); //子傳父,輸出屬性 addNewItem(value: string) { this.newItemEvent.emit(value); //自定義事件觸發(fā) } }
父組件
import { Component } from '@angular/core'; @Component({ selector: 'app-root', template: `//監(jiān)聽自定義事件 `, }) export class AppComponent { items = ['item1', 'item2', 'item3', 'item4']; addItem(newItem: string) { this.items.push(newItem); } }
在元數(shù)據(jù)中聲明輸入和輸出屬性
固然可以在 @Directive 和 @Component 元數(shù)據(jù)中聲明 inputs 和 outputs,但不推薦提供別名
@Input()和@Output()可以接收一個參數(shù),作為變量的別名,那么父組件中只能用別名綁定
子組件
import { Component, Input, EventEmitter, Output } from '@angular/core'; @Component({ selector: 'app-root', template: `Today's item: {{item}}
` }) export class ItemDetailComponent { @Input('aliasItem') item: string; @Output('newItem') newItemEvent = new EventEmitter(); addNewItem(value: string) { this.newItemEvent.emit(value); } }
父組件
import { Component } from '@angular/core'; @Component({ selector: 'app-root', template: `//注意是監(jiān)聽的別名 `, }) export class AppComponent { currentItem = 'Television'; items = ['item1', 'item2', 'item3', 'item4']; addItem(newItem: string) { this.items.push(newItem); } }
輸入屬性一定要用中括號[]綁定?
如果綁定的值是靜態(tài)的,就不需要[];為了統(tǒng)一風格盡量用上[]
import { Component } from '@angular/core'; @Component({ selector: 'app-root', template: ``, }) export class AppComponent { // currentItem = 'Television'; }
先決條件
組件的屬性綁定
組件的事件綁定
輸入和輸出(父子組件通信)
基本的雙向綁定
子組件
import {Component, OnInit, ChangeDetectionStrategy, EventEmitter, Input, Output} from '@angular/core';@Component({ selector: 'app-sizer', template: ``, styles: [ ], changeDetection: ChangeDetectionStrategy.OnPush })export class SizerComponent implements OnInit { @Input() size: number | string; // 想要用雙向綁定語法,output變量名就一定是輸入屬性名加上Change @Output() sizeChange = new EventEmitter- + (); constructor() { } ngOnInit(): void { } dec() { this.resize(-1); } inc() { this.resize(+1); } resize(delta: number) { this.size = Math.min(40, Math.max(8, +this.size + delta)); this.sizeChange.emit(this.size); } }
父組件
import { Component } from '@angular/core';@Component({ selector: 'app-root', template: ` Resizable Text`, })export class AppComponent { fontSizePx = 16; }
雙向綁定工作原理
為了使雙向數(shù)據(jù)綁定有效,@Output() 屬性的名字必須遵循 inputChange 模式,其中 input 是相應 @Input() 屬性的名字。例如,如果 @Input() 屬性為 size ,則 @Output() 屬性必須為 sizeChange 。
上面的 sizerComponent 具有值屬性 size 和事件屬性 sizeChange。 size 屬性是 @Input(),因此數(shù)據(jù)可以流入 sizerComponent 。 sizeChange 事件是一個 @Output() ,它允許數(shù)據(jù)從 sizerComponent 流出到父組件。
上面例子,有兩個方法, dec() 用于減小字體大小, inc() 用于增大字體大小。這兩種方法使用 resize() 在最小/最大值的約束內(nèi)更改 size 屬性的值,并發(fā)出帶有新 size 值的事件。
簡寫形式
雙向綁定語法是屬性綁定和事件綁定的組合的簡寫形式
表單中的雙向綁定
因為沒有任何原生 HTML 元素遵循了 x 值和 xChange 事件的命名模式,所以與表單元素進行雙向綁定需要使用 NgModel
基本使用
根據(jù)之前基本的雙向綁定知識,[(ngModel)]語法可拆解為:
名為ngModel的輸入屬性
名為ngModelChange的輸出屬性
使用[(ngModule)]雙向綁定的前提條件是在模塊中引入FormsModule
import {Component} from '@angular/core'; @Component({ selector: 'example-app', template: `Value: {{ name }}
Valid: {{ ctrl.valid }}
Set value `, }) export class SimpleNgModelComp { name: string = ''; setValue() { this.name = 'Nancy'; } }
上面這行代碼相當于:
在表單中的使用
表單中使用[(ngModel)],需要做下面兩件事的其中之一
給控件加上name屬性
將ngModelOptions.standalone設為true
注意:表單中使用雙向數(shù)據(jù)綁定,知識點比較多,這里只做簡單了解,后續(xù)會出專門章節(jié)探討
循環(huán)指令 *ngFor (非?;A(chǔ),掌握)
arr:string[] = ['張三','李四','王五']; trackByItems(index: number, item: Item): number { return item.id; }索引值:{{i}} -- 內(nèi)容:{{item}}//trackBy一般和長列表一起使用,減少dom替換次數(shù),提升性能({{item.id}}) {{item.name}}
條件渲染 *ngIf ngStyle ngClass ngSwitch(非常基礎(chǔ))
isShow: Boolean = true; personState: number = 2; //頻繁切換不建議用,頻繁加載和移除有較高的性能消耗 (重要)命令模式
// 不頻繁切換推薦用命令模式
// 頻繁切換推薦用 currentStyles = { 'font-style': this.canSave ? 'italic' : 'normal', 'font-weight': !this.isUnchanged ? 'bold' : 'normal', 'font-size': this.isSpecial ? '24px' : '12px' };ngClassngStyle// 使用樣式有2種(style.dispaly 和 class.hidden)style模式
//頻繁切換建議用樣式class模式
//匹配多種情況的條件渲染,跟vue的v-if/v-else-if/v-else類似 //適合多種狀態(tài),顯示一種的情況工作吃飯睡覺
雙向數(shù)據(jù)綁定指令 [(ngModel)]
//Angular不能直接識別ngModel,需要通過引入模塊FormsModule來訪問 import {FormsModule} from '@angular/forms'; imports: [FormsModule] public name = "張三"; //人工綁定,更好的做法是通過響應式表單綁定 //備選 //屬性綁定+事件綁定 = ngModel (重要)
基本使用
使用井號(#)聲明模板引用變量,可以獲取DOM 元素、指令、組件、TemplateRef 或 Web Component。
import {Component} from '@angular/core'; @Component({ selector: 'app-tpl-var', template: `Call `, }) export class TplVarComponent { constructor() { } callPhone(value: string) { console.log('callPhone', value); } }
ref
還有種寫法就是ref, 下面兩種寫法是一樣的
引用組件
在組件章節(jié),介紹了獲取子組件的屬性和方法,有兩種方法:本地變量和@viewChild()
import {Component} from '@angular/core'; @Component({ selector: 'app-tpl-var', template: ``, }) export class TplVarComponent { size = 16; constructor() { } }app inc size: {{ size }}
輸入屬性
子組件
import { Component, Input } from '@angular/core'; @Component({ selector: 'app-root', template: `Today's item: {{item}}
` }) export class ItemDetailComponent { @Input() item: string; }
父組件
import { Component } from '@angular/core'; @Component({ selector: 'app-root', template: ``, }) export class AppComponent { currentItem = 'Television'; }
輸出屬性
子組件
import { Component, Output, EventEmitter } from '@angular/core'; @Component({ selector: 'app-root', template: `Add to parent's list `, }) export class ItemOutputComponent { @Output() newItemEvent = new EventEmitter(); addNewItem(value: string) { this.newItemEvent.emit(value); } }
父組件
import { Component } from '@angular/core'; @Component({ selector: 'app-root', template: ``, }) export class AppComponent { items = ['item1', 'item2', 'item3', 'item4']; addItem(newItem: string) { this.items.push(newItem); } }
在元數(shù)據(jù)中聲明輸入和輸出屬性
固然可以在 @Directive 和 @Component 元數(shù)據(jù)中聲明 inputs 和 outputs, 不推薦提供別名。
@Input()和@Output()可以接收一個參數(shù),作為變量的別名,那么父組件中只能用別名綁定 子組件
import { Component, Input, EventEmitter, Output } from '@angular/core'; @Component({ selector: 'app-root', template: `Today's item: {{item}}
` }) export class ItemDetailComponent { @Input('aliasItem') item: string; // decorate the property with @Input() @Output('newItem') newItemEvent = new EventEmitter(); addNewItem(value: string) { this.newItemEvent.emit(value); } }
父組件
import { Component } from '@angular/core'; @Component({ selector: 'app-root', template: ``, }) export class AppComponent { currentItem = 'Television'; items = ['item1', 'item2', 'item3', 'item4']; addItem(newItem: string) { this.items.push(newItem); } }
輸入屬性一定要用中括號[]綁定?
如果綁定的值是靜態(tài)的,就不需要[]
import { Component } from '@angular/core'; @Component({ selector: 'app-root', template: ``, }) export class AppComponent { // currentItem = 'Television'; }
常用的管道
1、大小寫字母轉(zhuǎn)換
str = 'Hello'; str1 = 'World';{{str | uppercase}}-{{str1 | lowercase}}
//str:hello str1:WORLD
2、 日期格式化(經(jīng)常使用)
today = new Date();現(xiàn)在的時間是{{today | date:'yyyy-MM-dd HH:mm:ss'}}
3、保留小數(shù)后面多少位 下面例子的含義是,3表示最少幾位整數(shù),后面的2-4表示最少最少2位小數(shù),最多4位小數(shù),不足補零,小數(shù)會四舍五入。
num = 125.156896;num保留4位小數(shù)的值是:{{num | number:'3.2-4'}}
//125.1569
4、貨幣轉(zhuǎn)換
count = 5; price = 1.5;數(shù)量:{{count}}
// 數(shù)據(jù):5價格:{{price}}
// 價格:1.5總價:{{(price * count) | currency:'¥'}}
// 價格:¥7.5
5、字符串截取
name = '只對你說';{{name | slice : 2 : 4}}
// 你說
6、json格式化(有時需要看一下數(shù)據(jù))
{{ { name: 'semlinker' } | json }}
// { "name": "semlinker" }
自定義管道
1、創(chuàng)建管道文件
ng g pipe /piper/mypiper
2、在管道文件中寫自己的邏輯transform兩個參數(shù)分別表示傳入值和參數(shù)
import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'multiple' }) export class MypiperPipe implements PipeTransform { transform(value: any, args?: any): any { //value:輸入值 args:參數(shù) if(!args){//無參的情況下 args = 1; } return value*args; } }
注意:通過命令行生成的管道(過濾器),會自動在全局聲明; 管道傳入的參數(shù)是在':'冒號后面表示
看完上述內(nèi)容,你們對angular10中怎么利用模板進行數(shù)據(jù)綁定有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。