В текущем (2020) Angular у меня есть два компонента, которые предназначены для совместного использования состояния activeProject
через службу. Для ApplicationProjectService
у меня определено следующее:
private activeProjectSource = new BehaviorSubject(undefined);
activeProject$ = this.activeProjectSource.asObservable();
set activeProject(v: any) {
this.activeProjectSource.next(v);
}
get activeProject() {
return this.activeProjectSource.value;
}
Я использую BehaviorSubject
в службе, так как я хочу, чтобы компоненты получали текущее значение при подписке без каких-либо изменений. Геттер / сеттер существует, потому что я делал другую привязку непосредственно к свойству службы, что, как я узнал, не рекомендуется.
Два родственных компонента, которые в конечном итоге прослеживаются до общего родителя, но я Я не использую @Input()
или @Output()
или какой-либо параметр, передаваемый в DOM:
this.appProjectService.activeProject$.subscribe(activeProject => {
this.activeProject = activeProject;
});
Каждый компонент привязывается к свойству this.activeProject
в соответствующем компоненте, используя [(ngModel)]
:
<input type="checkbox" [(ngModel)]="activeProject.someProperty">
Вопрос
Если каждый компонент получил то, что, как я думал, было копией от activeProject
до this.appProjectService.activeProject$.subscribe()
, как работает изменение локального свойства в один компонент отражается в другом? В конце концов, это именно то поведение, которое я хочу, но не могу понять, почему оно работает. Есть ли какая-то передача по ссылке, которую я не понимаю в rx js observables?