在我们的单页应用程序中,我们开发了一个集中式存储类,它使用 RxJS 行为主体来处理应用程序的状态及其所有变化。我们应用程序中的几个组件正在订阅我们商店的行为主题,以便接收对当前应用程序状态的任何更新。然后将此状态绑定到 UI,以便每当状态更改时,UI 都会反映这些更改。每当组件想要更改状态的一部分时,我们都会调用由我们的 store 公开的函数,该函数执行所需的工作并更新对行为主体调用 next 的状态。到目前为止没有什么特别的。(我们使用 Aurelia 作为执行 2 路绑定的框架)
我们面临的问题是,一旦组件更改它从商店接收到的本地状态变量,即使没有在 subejct 本身上调用 next(),其他组件也会更新。
我们还尝试订阅主题的 observable 版本,因为 observable 应该向所有订阅者发送不同的数据副本,但看起来情况并非如此。
看起来所有主题订阅者都在接收存储在行为主题中的对象的引用。
import { BehaviorSubject, of } from 'rxjs';
const initialState = {
data: {
id: 1,
description: 'initial'
}
}
const subject = new BehaviorSubject(initialState);
const observable = subject.asObservable();
let stateFromSubject; //Result after subscription to subject
let stateFromObservable; //Result after subscription to observable
subject.subscribe((val) => {
console.log(`**Received ${val.data.id} from subject`);
stateFromSubject = val;
});
observable.subscribe((val) => {
console.log(`**Received …Run Code Online (Sandbox Code Playgroud)