2

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

推荐的方式是使用这一行: export const metaReducers: MetaReducer<State>[] = !environment.production ? [storeFreeze] : [];

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

4

1 回答 1

4

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

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() })
于 2018-03-29T14:15:39.107 回答