我有一个simple app这涉及兄弟组件的通信。 这是通过 Observable 完成的。
这是由服务完成的:
@Injectable()
export class SharedService {
private caseNumber = new Subject<string>();
caseNumber$ = this.caseNumber.asObservable(); //components subscribe to this <--
publishData(data: string) {
this.caseNumber.next(data);
}
但我也可以in a different way :
@Injectable()
export class SharedService {
caseNumber$ = new Subject<string>(); //components subscribe to this <--
publishData(data: string) {
this.caseNumber$.next(data);
}
问题
这两种方法有什么区别,我应该使用哪一种?
最佳答案
主题是读写 Observables,它们在您命令式创建 Observable 时使用(不是通过事件、回调等),所有广播逻辑都是您的类/服务的内部逻辑。
通常,公开可观察值而不是主题是更好的做法,除非您需要外部组件来修改它。
但是,请注意,通过Subject而不是某些公共(public)方法来修改它会很奇怪,因为它是负责维护Subject
的服务,它由于广播是强制进行的,可能会导致意想不到的副作用。
考虑这项服务:
class FooService{
foo = new Subject<Foo>();
bar:boolean=false;
setFoo(foo:Foo){
this.bar=true;
this.foo.next(foo);
}
doStuff(){
if(this.bar){
//do stuff
}
}
}
如果对象通过 fooService.foo.next(new Foo()); 发出值,则 bar
属性(某些状态)不会更新,因此调用 fooService.doStuff()
时可能会出现问题。这就是为什么最好将 Observable 暴露给外界,并保持您的主题私有(private)。但请注意,正如 Python 世界的人们所说,“我们都是同意的成年人”。
A good article关于主题“我应该使用Subject还是Observable?”。
关于javascript - Angular2 通过 Observable 进行兄弟通信 - 最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43205691/