0

我正在实现一个数据存储服务来在多个兄弟组件之间共享数据。每个组件都需要收到有关数据存储更改的通知。数据存储不会自行填充,需要从控制器设置数据。

数据存储.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目标: - 在组件中拥有单独的对象,可以通过调用方法对其进行更改然后发送到商店

4

1 回答 1

1

如果他们打算修改数据,每个订阅者都可以克隆数据:

// Subscribe to changes in the store
this.storeSubscription = this.documentIssueStore.documentIssue().subscribe(
  (data: DocumentIssueModel) => {
    this.documentIssue = cloneDeep(data);
  }
);
于 2017-12-02T20:07:32.483 回答