Angular2的数据绑定

前言

NG的核心部分之一就是数据绑定。它们是内嵌在HTML里面的表达式,用来在HTML文档里产生动态内容。

举个例子:

<div [ngClass]="getClasses()" >

在这个例子中,div是宿主HTML元素,[]是单向数据绑定的标识,ngClass是目标(有指令型和属性型),getClasses()是表达式(可以直接写在模板里也可以是组件中的函数)。一句话就是宿主元素的目标要绑定到表达式上去,绑定的方向可以是单向的也可以是双向的。

分类

1.方括号单向数据绑定。

[目标]="表达式",数据流动方向为组件->模板

2.字符串插值绑定。

{{表达式}},数据流动方向为组件->模板

3.圆括号单向数据绑定。

(目标) ="表达式",数据流动方向为模板->组件。通常用来处理事件。

4.双向绑定。

[(目标)] ="表达式"。数据流动方向为模板<->组件

使用

方括号单向数据绑定

绑定属性时需要分清属性(property)和特性(attribute)绑定,绑定样式时有四种可选操作

property绑定

property是存在于DOM里的,例如input元素的value属性。

<input class="form-control" [value]="model.getProduct(1)?.name || 'None'" />
  • 为了防止表达式返回NUll,在表达式后面跟上一个?
  • 每个元素的property可以参考文档

attribute绑定

attribute是存在于HTML元素里的,不是所有的HTML元素的property都和attribute相符,比如说colspan。NG提供了绑定attribute属性的解决办法。

<td [attr.colspan]="model.getProducts().length">
    {{model.getProduct(1)?.name || 'None'}}
</td>

类和样式绑定

可以直接绑定HTML元素的样式或者类,也可以使用NG提供的指令达到目标。

类绑定

有三种方式。

  • [class]="表达式"

把表达式的结果替代原来存在的class

[class]="getClasses(1)"
  • [class.myClass]="表达式"

根据表达式返回结果添加myClass这个类

[class.myClass]="model.getProduct(2).price < 50"
  • [ngClass]="map"

把map对象的值添加到class里去,支持三种返回值:字符串,数组,对象

//html
[ngClass]="map"
//ts
map= {
    "text-xs-center bg-danger": product.name == "Kayak",
    "bg-info": product.price < 50
}

样式绑定

同样三种方式。不过没有替换样式的写法。

  • [style.color]="表达式"

把表达式的结果设置成单个样式属性。

  • [style.font-size.em]="表达式"

把表达式的结果设置成指定的样式和单位值。

  • [ngStyle]="map"

把样式设置成map对象的值。

//ts
map= {
    fontSize: "30px",
    "margin.px": 100,
    color: product.price > 50 ? "red" : "green"
}

字符串插值绑定

它被用于宿主元素的文本内容中。也是一种单向数据绑定,常常用于显示某个数据。

<p>{{data||getData()}}</p>

圆括号单向数据绑定(事件绑定)

  • 事件绑定用于响应宿主元素发送的事件。是用户交互的核心。事件种类请参考文档
<td (mouseover)="selectedProduct=item.name">{{i + 1}}</td>
  • 也可以直接传入一个Event对象到组件里去。
<input class="form-control" (input)="getEvent($event)" />
  • 当需要传入HTML元素到组件时,可以借助模板引用变量
<input #product class="form-control" (input)="false" />

使用双向数据绑定

  • 使用ngModel指令可以简化了双向绑定的语法。
<input class="form-control" [(ngModel)]="selectedProduct" />
  • 其实NG中的双向绑定就是同时利用了两个方向上的单向绑定,拆开看其实就是:
< input class="form-control" [ngModel]="selectedProduct" (ngModelChange)="selectedProduct=$event.target.value" />  

实现原理

NG不像angular1.x使用脏检查来更新数据,而是使用了zone.js库来监视数据的变更,当组件里的数据发生了改变,NG会渲染模板DOM。当DOM的事件被触发了,NG会改变组件里的数据。

总结

数据绑定已经成为了当今前端框架不可或缺的核心特性之一,它让前端人员不再频繁关注视图(html)和逻辑(js)间的同步,而是专心编写高质量/可维护/松耦合的代码。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • AngularJS是什么?AngularJs(后面就简称ng了)是一个用于设计动态web应用的结构框架。首先,它是...
    200813阅读 1,517评论 0 3
  • 数据绑定为应用程序提供了一种简单一致的机制,来管理与协调数据的显示,以及数据值的变化。angular提供了多种数据...
    oWSQo阅读 668评论 0 1
  • 现在社会,各种突发事件频发,伴随着应急处置,一个名字叫做预案的东西开始进入我们的视野,预案管理作为企业管理的一个重...
    eeprom阅读 147评论 0 1
  • 流浪在深秋里的是雨声 和那只踮着脚尖行走在青石街上的猫 烧烤的摊子已经关门歇业 没有食物和火光 它不再吝惜自己的皮...
    安南禾阅读 198评论 0 2
  • 时光,它是个贼 偷走了我的天真 我的容颜 我的一切 我去追赶它 它跑的贼快 哎呀,不追了 我放慢了脚步 假装欣赏沿...
    无心旡花阅读 115评论 0 0