在Angular2的父/子组件层次结构中,你应该在什么时候订阅一个可观察对象?



我有18个指令,它们都挑选了父组件订阅的一个非常大的对象(不是http)。我是把属性分配给不同的指令呢,还是把可观察对象传递给不同的组件,让它们只订阅所需的属性呢?

总之,我应该:

  1. 将一个可观察对象传递给angular2指令,并从指令组件中订阅

  2. 在父类中订阅,并将结果数据传递给angular2指令。(这是我目前如何实现它)

在Angular2和组件树结构中出现了一个你应该使用的模式:DumbSmart components

  • 一个智能组件可以注册到任何你想要的,并有一些逻辑在它
  • 一个Dumb组件在对面应该被使用只显示一个视图与一些数据(传递为Input)

一个非常简单的例子是:

PersonComponent:一个哑组件应该显示一个人(比如名字和年龄)

  <div>
    Hi, my name is {{person.name}} and I'm {{person.age}} years old !
  </div>

PeopleComponent:调用PeopleService获取用户列表的智能组件。然后订阅响应(这是一个可观察对象)。他的视图应该显示如下的人员列表:

  <person *ngFor="let p of people" [person]="p"></person>
假设你甚至不需要在TS文件中订阅你的observable,那么你可以使用Angular2中的async管道:
<person *ngFor="let p of (people | async)" [person]="p"></person>

重要的是PersonComponent不会接收Observable(不管是第一种还是第二种解决方案)。它只是一个哑组件,必须在需要时显示数据(当可观察对象从服务器接收到至少一个响应时)。