首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Angular 7-为桌面聊天界面设计组件的有效方法?

Angular 7-为桌面聊天界面设计组件的有效方法?
EN

Stack Overflow用户
提问于 2019-02-16 13:35:10
回答 1查看 308关注 0票数 1

我需要开发一个桌面聊天界面就像LinkedIn。

我正在考虑创建一个父容器组件,它将有3个子组件,如截图所示。

组件1将拥有聊天用户列表列表。

组件2将有一个选定用户/组的所有消息的列表,并在底部有一个发送消息表单。

组件3将包含有关所选用户/组的详细信息,如共享媒体、标签、组名称、组图像。

组件2和组件3将订阅组件1的列表项单击。因此,每当从组件1单击用户/组时,该特定用户/组的所有详细信息都将填充到组件2和组件3中。

类似地,每个兄弟可以与其他2个组件通信,并根据需要更新彼此的数据。例如,如果用户从组件2中的消息表单发送一张照片,则组件1和组件3将相应地更新。

所有这三个组件都是兄弟组件,路由器路径将提供给包含所有这三个组件的父容器。

这是使用Angular 7设计这样的界面的正确方法吗?

EN

回答 1

Stack Overflow用户

发布于 2019-02-16 15:02:42

我设计了类似的东西,虽然较小,因为它只有两个面板,而不是三个:

我使用了两个子组件:

代码语言:javascript
复制
<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

这是该服务的一个片段:

代码语言:javascript
复制
private selectedProductSource = new BehaviorSubject<IProduct | null>(null);
selectedProductChanges$ = this.selectedProductSource.asObservable();

changeSelectedProduct(selectedProduct: IProduct | null): void {
    this.selectedProductSource.next(selectedProduct);
}

list组件:

代码语言:javascript
复制
  onSelected(product: IProduct): void {
    this.productService.changeSelectedProduct(product);
  }

详图构件(样板绑定到product的位置):

代码语言:javascript
复制
ngOnInit() {
    this.sub = this.productService.selectedProductChanges$.subscribe(
        selectedProduct => this.product = selectedProduct
    );
}

2)使用带有getters的简单服务。代码在这里:https://github.com/DeborahK/Angular-Communication/tree/master/APM-FinalWithGetters

服务(一个简单的属性):

代码语言:javascript
复制
currentProduct: IProduct;

list组件:

代码语言:javascript
复制
  onSelected(product: IProduct): void {
    this.productService.currentProduct = product;
  }

详图构件(样板绑定到product的位置):

代码语言:javascript
复制
get product(): IProduct | null {
    return this.productService.currentProduct;
}

3)使用NgRx进行状态管理。代码:https://github.com/DeborahK/Angular-NgRx-GettingStarted/tree/master/APM-Demo4

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54720228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档