我设计了类似的东西,虽然更小,因为它只有两个面板,而不是三个:
我使用了两个子组件:
<div class='row'>
<div class='col-md-4'>
<pm-product-shell-list></pm-product-shell-list>
</div>
<div class='col-md-8'>
<pm-product-shell-detail></pm-product-shell-detail>
</div>
</div>
您可以类似地添加第三个。
但是,我没有尝试让组件直接通信,而是设置了一个服务。每个组件都订阅了该服务以接收更改通知。
因此,如果用户从左侧列表中选择了一个项目,它会与服务通信,告知所选产品已更改。然后,另一个组件会从服务接收到发生更改的通知,因此它可以做出相应的反应(同样,这也适用于第三个组件。)
这使得系统的耦合度大大降低,并且更易于修改和维护。
我已经实现了这三种不同的方式:
1) 使用带有 BehaviorSubject 的简单服务。
代码在这里:https://github.com/DeborahK/Angular-Communication/tree/master/APM-Final
这是服务的sn-p:
private selectedProductSource = new BehaviorSubject<IProduct | null>(null);
selectedProductChanges$ = this.selectedProductSource.asObservable();
changeSelectedProduct(selectedProduct: IProduct | null): void {
this.selectedProductSource.next(selectedProduct);
}
列表组件:
onSelected(product: IProduct): void {
this.productService.changeSelectedProduct(product);
}
detail 组件(模板绑定到product):
ngOnInit() {
this.sub = this.productService.selectedProductChanges$.subscribe(
selectedProduct => this.product = selectedProduct
);
}
2) 使用带有 getter 的简单服务。
代码在这里:https://github.com/DeborahK/Angular-Communication/tree/master/APM-FinalWithGetters
服务(一个简单的属性):
currentProduct: IProduct;
列表组件:
onSelected(product: IProduct): void {
this.productService.currentProduct = product;
}
detail 组件(模板绑定到product):
get product(): IProduct | null {
return this.productService.currentProduct;
}
3) 使用 NgRx 进行状态管理。
代码在这里:https://github.com/DeborahK/Angular-NgRx-GettingStarted/tree/master/APM-Demo4