假设我有这个模板
sample.component.html:
<div *ngFor="let contact of contacts">
<my-contact-card [contact]="contact"></my-contact-card>
</div>
和这段代码
sample.component.ts
export class SampleComponent implements OnInit {
contacts: Subject<Contact>;
constructor(private _contactsService: ContactsService) {
...
}
ngOnInit() {
this._contactsService.getAll().subscribe(contact => {
<do something with contact>
this.contacts.next(contact);
}
}
当然,在ContactCardComponent
内,contacts
中的ngOnInit
订阅,因为这是@Input()
参数。是的,我知道,这个例子有点奇怪,只是为了明白这一点。
但问题是ContactCardComponent
的构造函数在第一个contact
发布后被调用,因此它只是第二个和所有后续值到达组件,第一个值丢失。
我甚至可以将SampleComponent
的订阅移至ngAfterViewInit
,无所谓,ContactCardComponent
仍然迟到了。
当然,我可能会使用BehaviorSubject
,但在某种程度上这种感觉很糟糕,我也必须在订阅之前提供一些起始值(显而易见的候选人:null
,然后再次必须在订户的代码内检查,这更糟糕。)
在这种情况下,最佳做法是什么?