我试图获取BehaviorSubject的当前值而不订阅它,因为之后需要进行一些更改,而由于特定的要求,这些更改不能反映实时性。我正在使用getValue()

样本BehaviorSubject值:

{
  ID_123: {
     logs: [
       {
         id: 1,
         record_id: 'ID_123',
         data: { complete: false }
         action: 'Modified',
         description: 'Modified filename',
       }
     ]
  }
}


服务等级:

private logs$ = new BehaviorSubject<any>(null);
private logsDataStore = {};
logsData = this.logs$.asObservable();

...

getData(id) {
   if (this.logsDataStore[id] !== undefined) {
       return this.logs$.getValue();
   }
}


单击按钮渲染getData()条目时,我从组件内部调用logs

id = 'ID_123';

onClick() {
   this.logsData = Object.assign({}, this.service.getData([this.id])[this.id]);
}


渲染每个logs条目:

<div *ngFor="let log of logsData.logs" class="log">
   <a *ngIf="!log.data.complete" (click)="markComplete(log.record_id, log.id, log.data)">
     Mark Complete
   </a>
</div>


markComplete(recordId, id, data) {
   let dataClone = Object.assign({}, data);
   dataClone.complete = true;
   this.service.updateLog(recordId, id, dataClone);
}


返回服务类:

updateLog(recordId: string, id: string, newValues: object) {
    const selectedRecord = this.logsDataStore[recordId];
    if (selectedRecord !== undefined) {
      if (selectedRecord.logs && selectedRecord.logs[id]) {
        let selectedLogEntry = selectedRecord.logs[id];
        Object.keys(newValues).forEach(
          (logKey) => {
            selectedLogEntry[logKey] = newValues[logKey];
          }
        );
      }
    }

    // this.logs$.next(Object.assign({}, this.logsDataStore));
  }


问题:

无论如何,即使我没有订阅该服务并在使用前从getData()克隆了结果,“标记完成”链接也会立即消失。好像保留了BehaviorSubject中对对象的引用?

我想念什么?

最佳答案

我发现了一些新东西。

当我使用时:

JSON.parse(JSON.stringify(this.service.getData([this.id])[this.id]));


有效。

以前,我假设Object.assign()JSON.parse(JSON.stringify())的工作方式相同,但事实证明,JSON.parse(JSON.stringify())是创建深层副本并且没有为您提供对原始对象的引用的副本。

关于javascript - 如何一次获取BehaviorSubject的当前值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59995546/

10-13 00:38