我在mono-repo中有两个应用程序,一个是另一个的免费子集,因此免费的所有功能都包含在非自由的中。
我试图设置我的效果,以便有一个核心效果类来实现所有常见效果,然后在非自由项目中扩展它以添加其他效果。这不起作用。两个应用程序都可以使用核心效果,只要我定义了所有效果,但只要我为类别添加更多效果,就会停止识别核心效果。
以下是设置:
EffectsModule.forRoot([NotFreeEffects])
和EffectsModule.forRoot([FreeEffects])
。如果我正确地理解了这一点,这意味着我的继承类正确设置,因为仍然可以看到核心效果(除非我在继承的类中定义其他效果)例如,LoadLayout效果如下所示(其他类似):
@Effect()
loadLayout$: Observable<Action> = this.actions$
.ofType(CoreLayoutActions.LOAD_LAYOUT)
.switchMap(() => this.layoutService.loadLayout())
.map(
(layoutState: ICoreLayoutState) =>
new CoreLayoutActions.LoadLayoutSuccessAction(layoutState)
);
当我使用此设置运行任一应用程序时,一切正常。我在reducers中添加了日志语句,因此我可以看到LoadLayoutSuccess消息何时在reducer中传递和处理。
只要我向NotFreeEffect类添加另一个效果(即免费应用程序未使用的那个),就不再处理核心效果 - 我在reducers中的日志语句不再表示已调度LoadLayoutSuccess。 除了向非自由类添加完全不相关的效果之外,没有任何改变。免费的应用程序继续工作,非免费的不会。如果我从非自由中删除了这个额外的效果,它会再次开始识别核心效果。
我错过了什么?你能继承像这样的效果类吗?
详细说明:
Angular:5.2.7 ...动画,常见,编译器,编译器 - cli,核心,表单 ...语言服务,平台浏览器,平台浏览器动态 ...路由器
@ angular / cdk:5.2.5
谢谢,
TTE
答案 0 :(得分:3)
这是各种症状的一个已知问题。本质上,在效果的上下文中使用扩展是错误的。我的经验是,只要您在子类中没有任何影响,就可以在基类中起作用。
https://github.com/ngrx/platform/issues/586
https://github.com/ngrx/platform/issues/1234
更新:由于这种提交https://github.com/ngrx/platform/commit/e7ae8a228ee4338b6beac4baf0bba745fa32c917#diff-708a6e5fc1424e81075508aee61cb59f的效果在子类化时根本不再起作用。原因是使用“ hasOwnProperty”,而不是直接访问effects-metadata-property。
不幸的是,Ngrx团队不想更改此行为
https://github.com/ngrx/platform/pull/890
有关解决方法,请参见this answer。
答案 1 :(得分:3)
您可以尝试这种方式。
abstract class GenericEffects {
protected constructor(
protected actions$: Actions,
) {}
protected _someGenericEffect$ = this.actions
.pipe(
ofType('GENERIC_ACTION')
...
)
}
class SpecificEffects extends GenericEffects {
@Effect()
someSpecificEffect$ = this._someGenericEffect$;
}
答案 2 :(得分:0)
自版本8.0.0-beta.0起,NgRx提供了createEffect函数。
要使NgRx效果在继承的类中起作用,只需使用新的createEffect函数(如下面的代码片段)替换修饰的效果即可:
import { createEffect, ofType } from '@ngrx/effects';
loadLayout$ = createEffect(() => this.actions$...);
您可以通过运行来安装最新的Beta(您可能还需要将rxjs更新为@latest):
npm install --save @ngrx/store@next @ngrx/effects@next @ngrx/schematics@next @ngrx/store-devtools@next