我有18个指令,它们都挑选了父组件订阅的一个非常大的对象(不是http)。我是把属性分配给不同的指令呢,还是把可观察对象传递给不同的组件,让它们只订阅所需的属性呢?
总之,我应该:
-
将一个可观察对象传递给angular2指令,并从指令组件中订阅
-
在父类中订阅,并将结果数据传递给angular2指令。(这是我目前如何实现它)
在Angular2和组件树结构中出现了一个你应该使用的模式:Dumb和Smart 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(不管是第一种还是第二种解决方案)。它只是一个哑组件,必须在需要时显示数据(当可观察对象从服务器接收到至少一个响应时)。