angular2--数据绑定

        今天要跟大家分享的是angular2模板中涉及到的数据绑定,Angular提供了多种数据绑定方式,可以根据数据流动的方向分为三种,详见下文:

1) 单向:从数据源到视图目标(属性绑定),插值DOM元素属性绑定,HTML标签特性绑定

2) 单向: 从视图目标到数据源(事件绑定)

3) 双向绑定

上面介绍了系统的分类,下面将具体介绍详细的绑定方式

1.插值绑定(使用双大括号{{ }}的语法)

实现方式:

<div>手机号码:</div><div>{{detail.telNum}}</div>

当然表达式也可以调用宿主组件的函数,例如:

<div>{{detail.getName()}}</div>


2.属性绑定(使用[])

       这里详细的说一下,在属性绑定中,"="左侧中括号的作用是让Angular执行"="右侧的模板表达式,并将结果赋值给该目标属性。如果没有中括号,Angular就会把"="右侧的模板表达式当做一个字符串常量,而不会计算该字符串,所以如果是赋值给该目标属性的值是一个字符串,中括号可以省略。

(1)DOM元素属性绑定

    1)实现方式:<img [src]="srcUrl">

       这样就可以将img标签的src属性设置为组件中的srcUrl值。但是使用[]只能绑定在DOM元素已有的属性上,例如<div [src]="srcUr"></div>是会报错的,以为div不存在src属性。

    2)设置Angular指令的属性

     <div [ngStyle]="styles"></div>

    3)还可以使用属性绑定设置自定义组件的输入属性(这是父子组件间通讯的重要途径,详情可以见上篇组件交互的文章),示例代码如下:

<user-detail  [user]="currentUser"></user-detail>

(2) css类绑定

    1)<div class="red font14"  [class]="changeGreen"></div>

    2)<div class="red font14"  [class.className]="isBlue()">>

这两者的区别分别是,第一种当DOM对象属性绑定给[class]绑定值时,changeCreen会覆盖这个div元素的全部class。第二种当isBlue()返回值为true时,className这个类添加到该绑定的标签上,否则移除这个类

(3)Style样式绑定

HTML标签内联样式可以通过Style样式绑定的方式来设置。样式属性可以使用烤肉串命名法(font-size),也可以使用驼峰式(fontSize)命名。

<div [style.background-color]="canClick ? 'blue' :'grey' "]></div>

<div [style.font-size.px]="isLarge ? 18 : 13 "></div>

3.事件绑定

事件绑定也是一种单向数据绑定方式,数据从模板流向组件类。

<div class="edit" (click)="editContact()"></div>

用事件绑定来监听按钮的点击事件,只要触发点击事件,就会调用editContact()方法。其中还有键盘事件,鼠标事件,触屏事件等来执行其对应绑定的方法。

当然,也可以通过@Output在我们的组件中添加自定义事件,@Output顾名思义就是在子组件中向父组件输出东西(这里就不细讲了,想了解的朋友可以看看组件交互那一块)。

4.双向绑定

Angular2是通过[()]来实现的,例如<input [(ngModel)]="value">就是双向绑定input元素的值。但是需要注意的是[()]只能绑定在有输入输出功能的DOM元素上(例如:input、textare),如果绑定在div这样的元素上就会报错。

那么,如何通过[()]在我们自定义的指令上实现双向绑定呢?没错,就是使用@Input和@Output来实现。

//父组件

 @Component({

selector: 'my-app',

   template:         

`<customer-counter [(counter)] = "someValue"></customer-counter>

<p> value: {{someValue}}</p>`,

directives:[CustomerCounterComponent] })

export class AppComponent{

someValue = 3;

 }

//子组件

 @Component({

selector: 'customer-counter',

template: `

<button (click)="decrement()">-</button>

<span>{{counter}}</span>`

})

export class CustomerCounterComponent{

counterValue = 0;

@Input()

 get counter(){

 return this.counterValue;

 }

@Output()

 counterChange = new EventEmitter();

 set counter(val) {

      this.counterValue = val;

      this.counterChange.emit(this.counterValue);

}

decrement() { this.counter--; } }

这样<customer-counter [(counter)] = "someValue"></customer-counter >就可以将父组件中的someValue绑定到子组件的counter属性上,同时当子组件的counter属性发生改变时也更新父组件的someValue值。

需要注意的是,我们定义的事件监听是counterChange,而使用的确实[(counter)]。这是因为Angular 2中约定添加后缀Change,也就是[(counter)]等价于[change]和(counterChange)的组合。如果去看[(ngModel)]的实现,你也会发现它是[ngModel]和[ngModelChange]的组合。

今天更新就到这里,谢谢

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,647评论 18 139
  • 前面有写到input的双向数据绑定,但除了双向数据绑定外,还存在单向数据绑定的概念,比如angular2:组件间的...
    SelinaFFighting阅读 306评论 0 1
  • 我们大部分父母在家庭扮演角色状态都是慈母严父,而在我们家是慈父严母。 我总是家里那张黑脸,而我老公总是那张红脸。他...
    营养私教西西阅读 234评论 0 0
  • 大学时期读马尔克斯的《百年孤独》,读了大概一章的样子完全无法理解,以致于闲置了快一个月书到期了还没再多翻几页...
    嘉里阅读 431评论 0 1
  • 当晨曦初现, 独依窗前的你, 会不会忽然浅笑, 忽然之间,把我想起? 而在那生机勃勃的清晨, 有谁会注意, 你突然...
    青云居士阅读 202评论 0 0