注意:您可以只看一下方法1和方法2部分,它们是两种方法之间的唯一区别:
我使用以下方法来通知我的Angular
应用中的其他组件:
@Injectable()
export class DataService {
private eventTracker = new BehaviorSubject<any>();
// ??? Approach 1
getEvent(): BehaviorSubject<any> {
return this.eventTracker;
}
setEvent(param: any) {
this.eventTracker.next(param);
}
}
export class DemoComponent implements OnInit {
subscription;
ngOnInit() {
subscription = dataService.getEvent().subscribe((param: any) => {
//do what ever needs doing when data changes
});
}
//update the value of data in the service
this.eventProxyService.setEvent(param);
}
另一方面,通过Observable
也有类似的用法,如下所示(发布在Angular BehaviorSubject Service上):
@Injectable()
export class DataService {
private eventTracker = new BehaviorSubject<any>();
// ??? Approach 2
data = this.eventTracker.asObservable();
setEvent(param: any){
this.eventTracker.next(data);
}
}
export class DemoComponent implements OnInit {
subscription;
ngOnInit() {
dataService.data.subscribe(data => {
//do what ever needs doing when data changes
})
}
//update the value of data in the service
dataService.updateData(newData);
}
差异 , 优点 和 缺点 < / strong>在上述两种方法之间?
答案 0 :(得分:4)
由于所有RxJS主题都扩展了Observable类,因此可以在BehaviorSubject实例上使用所有Observable和Subject方法。 asObservable
方法不仅将其强制转换为Observable
,而且还删除了Observer
实现。因此,您将无法在next
返回的实例上调用error
,complete
和asObservable()
。
以下是简单的ts:
const sub = new BehaviorSubject<any>(null);
sub.next('foo'); // works as intended
const obs = sub.asObservable();
obs.next('bar'); // doesn't work at all
为了提高源代码的可预测性,我不会公开展示整个Subject实例。我宁愿使用公共方法来在主题上发出值,并仅公开Subject的Observable实例。所以我一定会倾向于您的第二种方法。