2017-12-02 174 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); 
    } 
);