Javascript 角度(9)组件之间共享公共状态

Javascript 角度(9)组件之间共享公共状态,javascript,angular,typescript,Javascript,Angular,Typescript,在current(2020)Angular中,我有两个组件打算通过服务共享activeProject的状态。我在ApplicationProjectService上定义了以下内容: private-activeProjectSource=new-BehaviorSubject(未定义); activeProject$=this.activeProjectSource.asObservable(); 设置activeProject(v:any){ this.activeProjectSource.

在current(2020)Angular中,我有两个组件打算通过服务共享
activeProject
的状态。我在
ApplicationProjectService
上定义了以下内容:

private-activeProjectSource=new-BehaviorSubject(未定义);
activeProject$=this.activeProjectSource.asObservable();
设置activeProject(v:any){
this.activeProjectSource.next(v);
}
获取activeProject(){
返回this.activeProjectSource.value;
}
我在服务中使用
BehaviorSubject
,因为我希望组件在订阅时获得当前值,而不做任何更改。getter/setter之所以存在,是因为我正在直接对服务属性进行一些其他绑定,而我从中学到的是不推荐这样做

这两个同级组件最终可以追溯到一个公共父级,但我没有使用
@Input()
@Output()
或在DOM中传递的任何参数:

this.appProjectService.activeProject$.subscribe(activeProject=>{
this.activeProject=activeProject;
});
每个组件都使用
[(ngModel)]
绑定到各自组件中的
this.activeProject
属性:


问题


如果每个组件都通过
this.appProjectService.activeProject$.subscribe()
获得了我认为是
activeProject
的副本,那么一个组件中本地属性的更改如何反映在另一个组件中?最后,这是我想要的行为,但我不明白为什么它会起作用。在rxjs观测值中是否存在一些我不理解的传递引用?

如果有两个组件,则两个局部变量
activeProject
使用相同的
activeProject
引用
ngModel
绑定到此引用的属性。这是可行的,因为组件中的更改只会更新引用的属性,而不会更改引用。您甚至可以使用变量
activeProject
,而无需将其包装在
BehaviorSubject
中。如果有两个组件,则两个局部变量
activeProject
使用相同的
activeProject
引用
ngModel
绑定到此引用的属性。这是可行的,因为组件中的更改只会更新引用的属性,而不会更改引用。您甚至可以使用变量
activeProject
,而无需将其包装在
行为主体中

我知道这应该在注释中,但注释中的大部分字母是不可接受的

暂时忘掉
RxJS

现在您的属性有了
getter
setter

您可以在服务中设置
activeProjectValue

现在,当您在一个组件中订阅它时,您将获得通过引用传递的
对象。其他组件也一样。当两个组件访问同一对象时,它们通过引用传递

如果必须打破引用,请以不同的方式使用它

另外,
每个组件都获得了我认为是activeProject的一个副本
。。。。这意味着它们通过对象的引用进行复制

我知道,你们知道如何打破引用,但这只是为了未来的观众

要中断对象的引用,可以使用
JSON.parse(JSON.stringify(*ObjectName*)

在你的例子中

this.appProjectService.activeProject$.subscribe(activeProject => {
   this.activeProject = JSON.parse(JSON.stringify(activeProject));
});

我知道这应该在评论中,但这大部分信件评论都不会接受

暂时忘掉
RxJS

现在您的属性有了
getter
setter

您可以在服务中设置
activeProjectValue

现在,当您在一个组件中订阅它时,您将获得
对象
,该对象将通过引用传递。另一个组件也是如此。由于两个组件都访问相同的对象,因此它们通过引用传递

如果必须打破引用,请以不同的方式使用它

另外,
每个组件都获得了我认为是activeProject的副本,
…这意味着它们通过引用对象进行复制

我知道,你们知道如何打破引用,但这只是为了未来的观众

要中断对象的引用,可以使用
JSON.parse(JSON.stringify(*ObjectName*)

在你的例子中

this.appProjectService.activeProject$.subscribe(activeProject => {
   this.activeProject = JSON.parse(JSON.stringify(activeProject));
});

我建议,访问这段youtube视频,你会确切了解如何在angularI中使用Subject,这段视频似乎与我从其他地方找到的内容相匹配,并且大部分实现了。我想我的问题不止于此,我想知道为什么我的代码会这样做,当使用Subject、Observable和各种绑定时。我建议,访问这段youtube视频,你会确切了解如何在angularI中使用Subject,这段视频似乎与我从其他地方找到的内容相匹配,并且大部分实现了。我想我的问题不止于此,我想知道为什么我的代码会这样做,当使用Subject、Observable和各种绑定时。这就是这是我最初的想法,但我越想越觉得有些不对劲。局部变量没有直接引用到
activeProject
的服务实例,而是主体发出的变量,我假设它是两个不同的实例。这是否意味着可观察对象正在发出对存储的实例而不是变量的值?可观察对象发出值,但对象的值是它的引用。这就像
const c={val:1};const a=c;const b=c;a.val=2;console.log(b.val)//2;console.log(c.val)//2;
这是我最初的想法,但我越想越觉得有些不对劲。局部变量没有直接引用
activeProje的服务实例