SAP Spartacus 标准的 Effects 实现的注入原理

先研究标准的 effect 为何可以被 call 到:在 ProductReviewsEffects 构造函数里设置断点:

SAP Spartacus 标准的 Effects 实现的注入原理_第1张图片

发现在访问首页时,断点即触发。
SAP Spartacus 标准的 Effects 实现的注入原理_第2张图片

为什么 AppModule 启动时,就要加载 ProductReviewEffect?
SAP Spartacus 标准的 Effects 实现的注入原理_第3张图片

单击 AppModule,就跳转到我自定义的 AppModule 文件了,但是该文件里并没有 ProductReviewEffect:
SAP Spartacus 标准的 Effects 实现的注入原理_第4张图片

这个 EffectFeatureModule 是标准框架的实现:
SAP Spartacus 标准的 Effects 实现的注入原理_第5张图片

Spartacus 所有标准的 Effects 实例,都是在下列代码 ngrx-effects.js 里实例化的:

SAP Spartacus 标准的 Effects 实现的注入原理_第6张图片

function createEffects(injector, effectGroups, userProvidedEffectGroups) {
    /** @type {?} */
    const mergedEffects = [];
    for (let effectGroup of effectGroups) {
        mergedEffects.push(...effectGroup);
    }
    for (let userProvidedEffectGroup of userProvidedEffectGroups) {
        mergedEffects.push(...userProvidedEffectGroup);
    }
    return createEffectInstances(injector, mergedEffects);
}

SAP Spartacus 标准的 Effects 实现的注入原理_第7张图片

问题就是,对于 AppModule 而言,这些 Effects 是从哪里解析出来的?

SAP Spartacus 标准的 Effects 实现的注入原理_第8张图片

看一下标准的 Effects 是怎么做的?

SAP Spartacus 标准的 Effects 实现的注入原理_第9张图片

SAP Spartacus 标准的 Effects 实现的注入原理_第10张图片

export const effects: any[] = [
  ProductsSearchEffects,
  ProductEffects,
  ProductReviewsEffects,
  ProductReferencesEffects,
];
EffectsModule.forFeature(effects),

解决方案

SAP Spartacus 标准的 Effects 实现的注入原理_第11张图片

SAP Spartacus 标准的 Effects 实现的注入原理_第12张图片

最后,生效了:
SAP Spartacus 标准的 Effects 实现的注入原理_第13张图片

更多Jerry的原创文章,尽在:"汪子熙":

你可能感兴趣的