这正是他们在Angular2 Docs是怎么说的:
创建一个可观察
服务注入相同服务的两个组件
从一个组件将数据更新到服务
从你的服务
防爆读取数据的其他组件。
的服务:
@Injectable()
export class DataService {
private dataObs$ = new Subject();
getData() {
return this.dataObs$;
}
updateData(data: boolean) {
this.dataObs$.next(data);
}
}
的组件:
@Component({
selector: 'my-app',
template: `<div (click)="updateData(false)">Click t oupdate Data FALSE</div>
<div (click)="updateData(true)">Click to update Data TRUE</div>
<child></child>
`
})
export class AppComponent {
constructor(private dataService: DataService) {}
updateData(value: boolean) {
this.dataService.updateData(value);
}
}
@Component({
selector: 'child',
template: `<div><p>data from Service HERE:</p><p style="color:red"> {{myData}}</p></div>`
})
export class ChildComponent {
myData: boolean;
constructor(private dataService: DataService) {}
ngOnInit() {
this.dataService.getData().subscribe(data => {
this.myData = data;
})
}
}
确保在组件注入相同的服务(辛格尔顿):
@NgModule({
imports: [ BrowserModule, HttpModule ],
declarations: [ AppComponent, ChildComponent ],
providers: [ DataService ],
bootstrap: [ AppComponent ]
})
一个完整的工作示例可以发现HERE: http://plnkr.co/edit/nJVC36y5TIGoXEfTkIp9?p=preview
PS:这是一个通过服务的通信如何Angular2工作,它不一样,如果你的组件通过路由器是路由器出口内部关系,它的工作原理到处。
如果您的应用程序状态树不适合您的组件树,那么http://redux.js.org/可以提供帮助。只是一个建议 – mfrachet
您可以将AppComponent实例注入到路由组件并使用其属性。但这是一个糟糕的做法。你不能通过输入来传递'boolshow'来路由组件。这是因为共享服务是推荐的方式。 – estus