共享数据 - 的问题,由于对象引用
问题描述:
我实施数据存储服务来分享多个兄弟组件之间的数据。每个组件都需要得到有关数据存储区更改的通知。数据存储不会自行填充,数据需要从控制器设置。共享数据 - 的问题,由于对象引用
data.store.ts
@Injectable()
export class DocumentIssueStore {
private _documentIssue: BehaviorSubject<DocumentIssueModel>;
constructor() {
this._documentIssue = new BehaviorSubject(null);
}
public setValue(newVal: DocumentIssueModel) {
this._documentIssue.next(cloneDeep(newVal));
}
public documentIssue(): Observable<DocumentIssueModel> {
return this._documentIssue.asObservable();
}
public current(): DocumentIssueModel {
return cloneDeep(this._documentIssue.getValue());
}
在这两种组分的ngInit
方法,我订阅数据存储:
// Subscribe to changes in the store
this.storeSubscription = this.documentIssueStore.documentIssue().subscribe(
(data: DocumentIssueModel) => {
this.documentIssue = data;
}
);
问题: 在任何组分改变this.documentIssue
导致:
- 更改实例(
this.documentIssue
)在所有其他组件订阅 - 在店里改背景(
this._documentIssue.getValue()
)
目标: - 拥有的组件,这是可以改变的,然后通过调用发送到商店单独的对象setValue
方法
答
每个用户,如果他们打算修改它可以克隆的数据:
// Subscribe to changes in the store
this.storeSubscription = this.documentIssueStore.documentIssue().subscribe(
(data: DocumentIssueModel) => {
this.documentIssue = cloneDeep(data);
}
);
也许如果他们打算修改每个用户应该克隆的数据?这种情况让我想起了一个父组件将一个对象引用传递给许多子组件。通常父母不会为每个孩子克隆对象 - 孩子们会克隆对象以防止写入原始对象。但我不确定这是否是正确的心态。 –
这正是我需要的!谢谢! –
突变在主题(状态转变)的对象只应通过推动新值到的sTREM(subject.next()),所以基本上要在该对象不变性发生。 –