javascript - Angular2 通过 Observable 进行兄弟通信 - 最佳实践?

标签 javascript angular rxjs observable

我有一个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/

相关文章:

Angular 2 - FormGroup ValueChanges退订

rxjs - 在 Rx 中,我可以获取完整的序列,而不是仅获取最后一个去抖对象吗?

javascript - 通过 Angular 从 UL 中删除 LI

javascript - 如何将样式更新到 jquery mobile 中的 ListView ?

javascript - $location.path 重定向到错误的位置

angular - 如何在子组件中默认加载嵌套组件

javascript - 如何根据图像缩放图像 - css

angular - 在组件之间导航时保​​持路线一致

angular - 减少用于部署的 Angular 2 文件大小

Angular 2 : Cannot find name 'Subscription'