我在有角度的应用程序中使用NGRX,并使用选择器来获取当前作业密钥,如下所示。使用此键,从文档存储中拍摄图像。
我正在查看一些链接,建议ngrx是状态存储,而不是文档存储。我发现将其用作文档存储会极大地减慢速度。
https://github.com/btroncone/ngrx-store-localstorage/issues/39
无论如何,解决方案是拥有一个单独的图像存储,并仅以ngrx状态处理图像密钥/标识符。哪个效果很好。
this.store
.pipe(select(getCurrentImage))
.subscribe(async currentImageKey => {
this.loadImage(currentImageKey);//Load and set the currentFile
});
稍后在应用程序中更新图像时,但图像键/标识不会更改,因此我想通过从选择器中释放备忘录来强制进行更新。这将导致再次从文档存储中检索图像。
此答案建议发布备忘录。
Create non-memoized selector on ngrx
因此,遵循该建议,在调用图像处理操作之前尝试释放选择器。
async onAnalyseImage() {
getCurrentImage.release();
this.store.dispatch(
ImageViewerActions.analyseImage({
jobKey: this._currentFile.jobKey
})
);
}
然后,一旦动作/效果完成,我想通过一些更改来更新当前图像的值,但是状态中的键没有更改。因此,我释放选择器,该选择器应将备注值设置为null。
on(ImageViewerActions.refreshImageCanvas, state => ({
...state,
currentLoadedImage: state.currentLoadedImage,
})),
调用“刷新”操作,reduce尝试将状态值设置为相同的值,希望再次调用选择器。
这不会发生,记忆仍然存在。我可以更改为另一张图像,然后按预期方式,将调用选择器并更新该图像。
但是,我无法刷新相同的值键。
答案 0 :(得分:0)
currentLoadedImage是一个字符串。
备忘录进行字符串比较,在Javascript中,字符串是字符串,是字符串。
因此,即使可以传递新的字符串对象,它仍将显示为同一对象。 a === b