我试图获取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/