在父子指令及组件之间共享数据
Angular 中的一个常见模式就是在父组件和一个或多个子组件之间共享数据。可以用 @Input()
和 @Output()
来实现这个模式。

创新互联成立以来不断整合自身及行业资源、不断突破观念以使企业策略得到完善和成熟,建立了一套“以技术为基点,以客户需求中心、市场为导向”的快速反应体系。对公司的主营项目,如中高端企业网站企划 / 设计、行业 / 企业门户设计推广、行业门户平台运营、手机APP定制开发、手机网站制作设计、微信网站制作、软件开发、IDC机房托管等实行标准化操作,让客户可以直观的预知到从创新互联可以获得的服务效果。
本章包含代码片段的可工作实例参阅现场演练 / 下载范例。
考虑以下层次结构:
充当了
的上下文。
@Input()
和 @Output()
为子组件提供了一种与其父组件通信的方法。 @Input()
允许父组件更新子组件中的数据。相反,@Output()
允许子组件向父组件发送数据。
把数据发送到子组件
子组件或指令中的 @Input()
装饰器表示该属性可以从其父组件中获取值。
要使用 @Input()
,就必须对父组件和子组件进行配置。
配置子组件
要使用 @Input()
装饰器,首先要导入 Input
,然后用 @Input()
装饰该属性,如下例所示。
import { Component, Input } from '@angular/core'; // First, import Input
export class ItemDetailComponent {
@Input() item = ''; // decorate the property with @Input()
}
在这个例子中, @Input()
会修饰属性 item
,它的类型为 string
,但 @Input()
属性可以是任意类型,比如 number
、string
、boolean
或 object
。item
的值来自父组件。
接下来,在子组件模板中添加以下内容:
Today's item: {{item}}
配置父组件
下一步是在父组件的模板中绑定该属性。在这个例子中,父组件模板是 app.component.html
。
- 使用子组件的 selector (
) 作为父组件模板中的指令。
- 使用属性绑定把子组件的
item
属性绑定到父组件的 currentItem
属性上。
- 在父组件类中,为
currentItem
指定一个值:
export class AppComponent {
currentItem = 'Television';
}
通过 @Input()
,Angular 把 currentItem
的值传给子组件,以便 item
渲染为 Television
。
下图展示了这种结构:
方括号 []
中的目标就是子组件中用 @Input()
装饰的那个属性。绑定源(等号的右边部分)则是父组件传给内嵌组件的数据。
监视 @Input() 的变更
要想监视 @Input()
属性的变化,可以用 Angular 的生命周期钩子OnChanges
。
把数据发送到父组件
子组件或指令中的 @Output()
装饰器允许数据从子组件传给父组件。
@Output()
在子组件中标记了一个属性,作为数据从子组件传递到父组件的途径。
子组件使用 @Output()
属性来引发事件,以通知父组件这一变化。为了引发事件, @Output()
必须是 EventEmitter
类型,它是 @angular/core
中用来发出自定义事件的类。
下面的例子给出了如何在组件中设置 @Output()
,来把数据从 HTML 的
推送到父组件的数组中。
要使用 @Output()
,就必须配置父组件和子组件。
配置子组件
下面的例子中有一个
,用户可以输入一个值,然后点击一个引发事件
第二个元素是带有 click
事件绑定 的