如今的前端开发,都朝组件式开发模式靠拢,如果使用目前最流行的前端框架Angular和React开发应用,不可避免地需要开发组件,也就意味着我们需要考虑组件间的数据传递等问题,不过Angular 2已经为我们提供了很好的解决方案。

父组件和子组件
接触过面向对象编程的开发者肯定不会对父子关系陌生,在Angular 2中子组件存在于父组件“体内”,并且父子组件可以通过一些渠道进行通讯。
父组件向子组件传入数据 – @Input
当我们着手开始开发一个组件时,第一件想到的应该就是为其传入数据,毕竟我们期望组件为我们处理某些工作通常就需要给其提供“养料”,毕竟不能又让马儿跑,又不给马儿吃草。Angular 2中子组件使用装饰器@Input接收父组件传入的数据:
// child-component.ts
import { OnInit, Component, Input } from '@angular/core';
@Component({
selector: 'child-component',
...
})
export class ChildComponent implements OnInit {
@Input
count: number = 0;
ngOnInit() {
console.log(this.count); // 父组件内传入的值或者我们自己设置的初始值0
}
increaseNumber() {
this.count ++;
}
descreaseNumber() {
this.count --;
}
}
可以看到,我们使用装饰器@Input修饰了count属性,这就意味着child-component被使用时期望收到一个名为count的属性,当然不属于自己掌控的范围内要小心行事,别人使用我们的组件时什么情况都可能出现,所以我们为count设置了一个初始值,当父组件没有给我们的count属性传值时,我们就取此初始值。
// father-component.ts
import { Component } from '@angular/core';
import { ChildComponent } from '../child-component/child-component';
@Component({
template: `
<child-component [count]='initialCount'></child-component>
`,
...
})
export class FatherComponent {
initialCount: number = 5;
}
父组件使用child-component时,为count属性赋予初始值initialCount,即5,也就是说此时ChildComponent的ngOnInit方法中会打印出5。注意[count]语法标识了数据流向:父组件流入子组件,即单向数据绑定。此时如果传入的数据是基本数据类型,子组件中对数组做任何操作都不会影响到父组件,但如果传入的不是基本数据类型,而是引用数据类型,则要格外注意子组件中对数据的操作可能会对父组件产生影响。
子组件通知父组件数据已处理完成 – @Output、EventEmitter
父组件传入数据给子组件之后并不是万事大吉了,就像父母养育孩子,供其读书,但孩子需要把学习进度、考试成绩等呈现给父母看(不管是否自愿…),父组件也需要子组件在合适的时机通知自己数据已经处理好,可以检阅了。而此时就需要使用@Output和EventEmitter了。
// father-component.ts
import { Component } from '@angular/core';
import { ChildComponent } from '../child-component/child-component';
@Component({
template: `
<child-component [count]='initialCount' (change)="countChange($event)"></child-component>
`,
...
})
export class FatherComponent {
initialCount: number = 5;
countChange($event) {
}
}
看看我们在父组件中加入了什么东东:
1.(change),看到这样的语法第一时间就知道这是事件绑定,也就是说我们在父组件中监听子组件的某些变化,并能够在其变化时作出相关操作;
2.增加了countChange方法作为change事件的处理函数。
但是稍等,当我们为input标签指定type、placeholder等属性时,我们知道它们都已经被“实现了”,所谓“实现”,即这些属性在input标签上是有意义的。但是目前这里我们为child-component指定了名为change的事件是没意义的,因为其并未“实现”change事件,于是下一步我们就需要使用@Output和EventEmitter将其变得有意义:
// child-component.ts
import { Component, Input, Output, EventEmitter } from '@angular/core';
@Component({
selector: 'child-component',
...
})
export class ChildComponent {
@Input
count: number = 0;
@Output
change = new EventEmitter();
increaseNumber() {
this.count ++;
this.change.emit(this.count);
}
descreaseNumber() {
this.count --;
this.change.emit(this.count);
}
}
让我们再来看看在子组件中增加了什么东东:
1.使用装饰器@Output修饰了change属性,并为其赋了初值为EventEmitter的实例;
2.在increaseNumber和descreaseNumber方法修改了count属性后,调用了change属性的emit方法通知父组件。
此时,我们在ChildComponent中实现了change,于是父组件中为child-component绑定change事件也就有意义了:当子组件通知父组件时,父组件可以获取到通知中携带的数据并进行下一步操作:
// father-component.ts
...
countChange($event) {
this.initialCount = $event;
}
...
总结
不知道你有没有发现,其实上面我们模拟了“双向数据绑定”:父组件将数据传入子组件,子组件改变数据时通知父组件进行“同步更新”。但是要注意其实数据流向是单向的,即数据是父组件单向流入子组件,父组件数据的更新是通过子组件的事件通知以后才被更新。也就是说其实在Angular 2中:双向数据绑定 = 单向数据绑定 + 事件,以我们最熟悉的ngModel为例:
<input type='text' name='userName' [(ngModel)]="userName">
和下面的写法是等价的:
复制代码 代码如下:
<input type='text' name='userName' [ngModel]="userName" (ngModelChange)="userName=$event">
同样的,如果将我们的child-component组件写作双向数据绑定的形式即为:
复制代码 代码如下:
<child-component [(count)]='initialCount'></child-component>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# angular2父子组件通信
# angular2
# 父子组件
# angular2父子组件通讯
# Angular2 父子组件通信方式的示例
# Angular 2父子组件之间共享服务通信的实现
# angular父子组件通信详解
# 绑定
# 为其
# 也就
# 也就是说
# 会对
# 当我们
# 有意义
# 中对
# 增加了
# 这是
# 实现了
# 很好
# 就像
# 是有
# 让我们
# 万事大吉
# 给我们
# 将其
# 这就
# 可以通过
相关文章:
C#如何使用XPathNavigator高效查询XML
网站制作公司排行榜,四大门户网站排名?
制作旅游网站html,怎样注册旅游网站?
建站之星下载版如何获取与安装?
青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
如何获取开源自助建站系统免费下载链接?
如何在Tomcat中配置并部署网站项目?
如何制作算命网站,怎么注册算命网站?
网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?
小说建站VPS选用指南:性能对比、配置优化与建站方案解析
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
如何彻底删除建站之星生成的Banner?
已有域名如何快速搭建专属网站?
,石家庄四十八中学官网?
如何快速启动建站代理加盟业务?
如何正确选择百度移动适配建站域名?
建站之星logo尺寸如何设置最合适?
装修招标网站设计制作流程,装修招标流程?
如何快速搭建高效香港服务器网站?
名字制作网站免费,所有小说网站的名字?
网站制作新手教程,新手建设一个网站需要注意些什么?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
建站主机如何安装配置?新手必看操作指南
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
太原网站制作公司有哪些,网约车营运证查询官网?
单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?
微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?
如何在建站之星网店版论坛获取技术支持?
javascript基本数据类型及类型检测常用方法小结
如何通过IIS搭建网站并配置访问权限?
建站之星云端配置指南:模板选择与SEO优化一键生成
建站之星安装后如何配置SEO及设计样式?
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?
如何选择靠谱的建站公司加盟品牌?
如何选择高效便捷的WAP商城建站系统?
如何选择适合PHP云建站的开源框架?
制作国外网站的软件,国外有哪些比较优质的网站推荐?
如何在阿里云ECS服务器部署织梦CMS网站?
如何用5美元大硬盘VPS安全高效搭建个人网站?
网站制作网站,深圳做网站哪家比较好?
如何使用Golang安装API文档生成工具_快速生成接口文档
番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?
如何通过wdcp面板快速创建网站?
如何通过多用户协作模板快速搭建高效企业网站?
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。