【发布时间】:2019-03-15 20:44:56
【问题描述】:
我正在尝试尽可能多地使用异步管道,因为我听说这是最佳做法,因为它为您管理可观察的订阅。
我的应用的一个非常简化的版本如下所示:
export class OrderDetailComponent implements OnInit {
order$: Observable<Order>;
lineItems$: Observable<LineItem>;
constructor(
private orderService: OrderService,
private lineItemService: LineItemService
) {}
ngOnInit() {
this.order$ = this.getOrders();
this.lineItems$ = this.getLineItems();
}
private getOrders(): Observable<Order> {}
private getLineItems: Observable<LineItem[]>;
}
然后模板看起来像这样:
<div *ngIf="order$ | async; let order">
Order#: {{order.ID}}
Line Items
<div *ngIf="lineItems$ | async; let lineItems">
<div *ngFor="let li of lineItems">
<app-lineitem-card [lineItem]="li"></app-lineitem-card>
</div>
</div>
Order Summary:
Total: {{order.Total}}
</div>
显然这是简化的,但关键是页面上几乎所有地方都需要顺序,所以我在最外层的 div 上使用异步管道。这在第一页加载时效果很好,但我遇到的情况是我更新了部分订单,它实际上只影响了页面的一小部分,比如说 order.Total。我知道我可以执行以下操作来更新订单:
this.order$ = this.getOrder()
但这会导致我的所有组件都被重新初始化(因为 ngIf)。处理这种情况的正确方法是什么?
【问题讨论】:
-
您可能正在定义一个太大的组件。例如,最好让
OrderDetailComponent由OrderIDComponent、OrderLineItemsComponent和OrderTotalComponent组成,它们分别封装了您在单个<div>中定义的内容。此可能提供的优势是,对Order的任何更改都只会发布到Order*Components 而不会发布其他任何内容。 -
我知道我的示例并没有真正显示它,但实际上订单详细信息页面由各种组件组成。问题是哑组件仍然在一个大型容器组件中,该组件进行 api 调用并负责在最外层解析数据。我可以让较小的组件进行 api 调用,但这听起来与许多架构最佳实践相矛盾(据说)。展示与容器等。
-
我认为智能/哑组件架构实现的误称是树的顶部只能有一个智能容器的概念。我个人不相信或坚持这一点,并在需要时创建智能/容器组件。我会尽量避免嵌套智能/容器组件,但在一个页面上,没有理由为什么页眉、内容和页脚不能是三个独立的智能容器,这就是我的回答所建议的。