Javascript Angular2通过可观察的兄弟姐妹沟通-最佳实践?

Javascript Angular2通过可观察的兄弟姐妹沟通-最佳实践?,javascript,angular,rxjs,observable,Javascript,Angular,Rxjs,Observable,我有一个涉及兄弟组件通信的解决方案。 这是通过可观察的方式实现的 这是由服务完成的: @Injectable() export class SharedService { private caseNumber = new Subject<string>(); caseNumber$ = this.caseNumber.asObservable(); //components subscribe to this <-- publishData(data: s

我有一个涉及兄弟组件通信的解决方案。 这是通过可观察的方式实现的

这是由服务完成的:

@Injectable()
export class SharedService {

  private caseNumber = new Subject<string>();  

  caseNumber$ = this.caseNumber.asObservable(); //components subscribe to this <--

  publishData(data: string) {
    this.caseNumber.next(data);
  }
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
    }
  }
}
@Injectable()
导出类共享服务{
私人案例编号=新主题();

caseNumber$=this.caseNumber.asObservable();//订阅此的组件主题是读写可观察的,它们在您强制创建可观察时使用(不是从事件、回调等),广播的所有逻辑都是类/服务内部的

通常,公开可观察对象而不是主体是一种更好的做法,除非您需要外部组件对其进行修改

但是,请注意,通过主题而不是某些公共方法修改主题会很奇怪,因为是服务负责维护
主题
,这可能会导致意外的副作用,因为广播是强制性的

考虑这项服务:

@Injectable()
export class SharedService {

  private caseNumber = new Subject<string>();  

  caseNumber$ = this.caseNumber.asObservable(); //components subscribe to this <--

  publishData(data: string) {
    this.caseNumber.next(data);
  }
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
    }
  }
}
class服务{
foo=新主题();
条形图:布尔值=假;
setFoo(foo:foo){
这个.bar=true;
this.foo.next(foo);
}
多斯塔夫(){
如果(本条){
//做事
}
}
}
如果一个对象通过
fooService.foo.next(new foo());
发出一个值,那么
bar
属性(某些状态)将不会更新,因此调用
fooService.doStuff()时可能会出现问题
。这就是为什么向外界公开一个可观察到的对象可能会更好,并将您的主题保密。但请注意,正如python世界的人所说,“我们都是同意的成年人”


关于“我应该使用一个主题还是一个可观察的?”。

那么,我的第一个或第二个示例中,哪一个更好?我会说第一个示例是因为第二个示例允许外部对象修改状态。哦,这就像Promise()接口(它减少了解析方法等)或多或少,当主体是读写时,可观察对象是只读的。修改状态是什么意思?这两个代码段都会导致
*。next()