无法在ngrx选择器上发布备忘录

时间:2019-11-08 05:22:57

标签: ngrx ngrx-store

我在有角度的应用程序中使用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尝试将状态值设置为相同的值,希望再次调用选择器。

这不会发生,记忆仍然存在。我可以更改为另一张图像,然后按预期方式,将调用选择器并更新该图像。

但是,我无法刷新相同的值键。

1 个答案:

答案 0 :(得分:0)

currentLoadedImage是一个字符串。

备忘录进行字符串比较,在Javascript中,字符串是字符串,是字符串。

因此,即使可以传递新的字符串对象,它仍将显示为同一对象。 a === b