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()