2017-12-02 173 views
0

我实施数据存储服务来分享多个兄弟组件之间的数据。每个组件都需要得到有关数据存储区更改的通知。数据存储不会自行填充,数据需要从控制器设置。共享数据 - 的问题,由于对象引用

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方法

+1

也许如果他们打算修改每个用户应该克隆的数据?这种情况让我想起了一个父组件将一个对象引用传递给许多子组件。通常父母不会为每个孩子克隆对象 - 孩子们会克隆对象以防止写入原始对象。但我不确定这是否是正确的心态。 –

+0

这正是我需要的!谢谢! –

+1

突变在主题(状态转变)的对象只应通过推动新值到的sTREM(subject.next()),所以基本上要在该对象不变性发生。 –

回答

1

每个用户,如果他们打算修改它可以克隆的数据:

// Subscribe to changes in the store 
this.storeSubscription = this.documentIssueStore.documentIssue().subscribe(
    (data: DocumentIssueModel) => { 
    this.documentIssue = cloneDeep(data); 
    } 
);