Как получить текущее значение BehaviorSubject один раз? - PullRequest
1 голос
/ 31 января 2020

Я пытаюсь получить текущее значение BehaviorSubject без подписки на него, потому что мне нужно внести некоторые изменения впоследствии, без изменений, отражающих в реальном времени, из-за специфика c требование. Я использую 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));
  }

Проблема :

Каким-то образом ссылка Mark Complete исчезает сразу же, когда вы нажимаете на нее, даже если я не подписался на услугу и клонировал результаты из getData() перед их использованием? Как будто ссылка на объект из BehaviorSubject была сохранена?

Чего мне не хватает?

1 Ответ

0 голосов
/ 31 января 2020

Я обнаружил что-то новое.

Когда я использовал:

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

Это сработало.

Ранее я предполагал Object.assign() и JSON.parse(JSON.stringify()) работал так же, но оказывается, JSON.parse(JSON.stringify()) - это тот, который создает глубокую копию и не дает вам ссылку на исходный объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...