如何在nx工作区中使用ngrx-store-freeze

时间:2018-03-29 08:48:13

标签: angular ngrx ngrx-store nrwl

我正在为我的应用程序使用nx工作区。我已将所有reducers放在libs部分,因为它们在多个应用程序之间共享。但是在创建元缩减器时,我想使用ngrx-store-freeze进行开发。

建议采用以下方式: export const metaReducers: MetaReducer<State>[] = !environment.production ? [storeFreeze] : [];

但是当我不知道要导入哪个环境因为我不知道哪个应用程序将在nx工作区中运行时,我怎么知道应用程序是否正在生产,并且ngrx reducer是纯函数所以我无法注入环境?

1 个答案:

答案 0 :(得分:3)

创建一个为您创建元缩减器的函数。此功能接受一个参数,指示它是否用于生产模式。

export function createMetaReducers(freeze = false): MetaReducer<State>[] {
    return freeze
        ? [storeFreeze] 
        : [];
}

像这样你的图书馆并不关心你是否处于生产模式,而你的图书馆的用户可以决定。

有关您的评论的更新

  

我已经创建了一个函数,但在我执行此操作之前,我无法在app.module.ts中的导入部分中使用此函数:'StoreModule.forRoot(reducers,{metaReducers}),'现在我已经尝试过了使用新函数StoreModule.forRoot(reducers,{createMetaReducers(true)})但得到错误:“类型'{createMetaReducers(:any):any;}'的参数不能分配给'StoreConfig'类型的参数。”你会如何解决这个问题?

您已经解决了问题,但我想解释一下发生了什么。

Typescript和现代ECMA脚本有一些语法糖来缩短某些东西。

假设您有一个要指定名称的对象:

const obj: any = { name: 'Tom' }

现在我们可能不会对名称进行硬编码,而是将其放在名为name的变量中。然后代码如下所示:

const name: string = 'Tom';
const obj: any = { name: name };

您可以看到变量的名称与对象中的字段相同。如果是这种情况,您只需删除: name部分并按如下方式编写:

const name: string = 'Tom';
const obj: any = { name };

此代码段的功能与上面的相同。

这称为Object Literal Property Value Shorthand(如果我错了,请给我纠错),你可以在这里找到更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer

现在回到你的代码。 StoreModule.forRoot需要两个参数。第二个参数是一个配置对象,您可以在其中传入元缩减器

StoreModule.forRoot(reducers, { metaReducers: [] })

所以要解决这个问题,你有两种可能性。

你做的很好:

const metaReducers = createMetaReducers();
StoreModule.forRoot(reducers, { metaReducers })

解决此问题的另一种方法是采用以下方法:

StoreModule.forRoot(reducers, { metaReducers: createMetaReducers() })