我有Angular组件,第一个组件使用第二个组件作为指令.它们应该共享相同的模型对象,该对象在第一个组件中初始化.如何将该模型传递给第二个组件?
对于从父级到子级的单向数据绑定,请使用@Input
装饰器(根据样式指南的建议)在子组件上指定输入属性
@Input() model: any; // instead of any, specify your type
并在父模板中使用模板属性绑定
由于传递对象(JavaScript引用类型),因此对父组件或子组件中的对象属性所做的任何更改都将反映在另一个组件中,因为两个组件都引用了同一对象.我在Plunker中展示了这一点.
如果重新分配父组件中的对象
this.model = someNewModel;
Angular会将新对象引用传播到子组件(作为更改检测的一部分自动传播).
您不应该做的唯一事情是重新分配子组件中的对象.如果这样做,父级仍将引用原始对象.(如果确实需要双向数据绑定,请参阅/sf/ask/17360801/).
@Component({
selector: 'child',
template: `child
{{model.prop1}}
`
})
class Child {
@Input() model: any; // instead of any, specify your type
updateModel() {
this.model.prop1 += ' child';
}
}
@Component({
selector: 'my-app',
directives: [Child],
template: `
Parent
{{parentModel.prop1}}
`
})
export class AppComponent {
parentModel = { prop1: '1st prop', prop2: '2nd prop' };
constructor() {}
updateModel() { this.parentModel.prop1 += ' parent'; }
}
Plunker - Angular RC.2
组件2,指令组件可以定义输入属性(@input
Typescript中的注释).组件1可以将该属性从模板传递给指令组件.
请参阅此SO答案如何在Angular2中的主组件和详细信息组件之间进行相互通信?
以及如何将输入传递给子组件.在你的情况下它是指令.
您还可以将数据存储在带有setter的服务中,并通过getter获取
import { Injectable } from '@angular/core'; @Injectable() export class StorageService { public scope: Array| boolean = false; constructor() { } public getScope(): Array | boolean { return this.scope; } public setScope(scope: any): void { this.scope = scope; } }