Вызовы функций не поддерживаются в декораторах NgRx / Effects при сборке приложения - PullRequest
0 голосов
/ 24 октября 2018

Я использую генератор Loopback SDK для создания модуля хранения / эффектов NgRx.Я настроил библиотеку для поддержки основных необходимых изменений.

Затем я написал собственный эффект для прослушивания действия GuardNotFound и перенаправления на страницу 404, но он не работает при сборке приложения.

Вот мой файл custom-effect.ts

@Injectable()
export class GuardFailEffect {
  constructor(private action$: Actions, private router: Router) {
  }
  @Effect({ dispatch: false })
  redirect$ = this.action$.pipe(
    ofType('[Campaign] Guard Fail', '[LoopbackAuth] Auth Guard fail'),
    tap(() => {
      this.router.navigateByUrl('/404');
    })
  );
}

export const CustomEffects= copy(LoopbackEffects); <--- array of effects classes generated from SDK
CustomEffects.push(GuardFailEffect); <--- inserting my custom effect


//function to deep copy the array of Classes aka objects
export function copy(o) {
  let output, v, key;
  output = Array.isArray(o) ? [] : {};
  for (key in o) {
    v = o[key];
    output[key] = typeof v === 'object' && v !== null ? copy(v) : v;
  }
  return output;
}

App.module.ts

imports : [
EffectsModule.forRoot(CustomEffects)
]

ПокаПри создании приложения я получаю эту ошибку

    ERROR in src\app\app.module.ts(89,27): Error during template compile of 'AppModule'
  Function calls are not supported in decorators but 'copy' was called in 'CustomEffects'
    'CustomEffects' calls 'copy'.

=> Если я не копирую массив в глубину, это вызывает ошибку при использовании функции push

[ts]
Argument of type 'typeof GuardFailEffect' is not assignable to parameter of type 'typeof LoopbackAuthEffects ... 5 more ... | typeof SubscriptionEffects'.
  Type 'typeof GuardFailEffect' is not assignable to type 'typeof SubscriptionEffects'.
    Types of parameters 'router' and 'subscription' are incompatible.
      Type 'SubscriptionApi' is not assignable to type 'Router'.
        Property 'rootComponentType' is missing in type 'SubscriptionApi'.
class GuardFailEffect

Может ли кто-нибудь указать мне правильное направление?

1 Ответ

0 голосов
/ 24 октября 2018

Я бы использовал шаблон forRoot в вашем случае для создания модуля, который вы хотите импортировать.Это должно позволить вам запускать пользовательский код.

@NgModule({
})
export class CustomEffectsModule {
  static forRoot() {
    const customEffects= this.copy(LoopbackEffects);
    customEffects.push(GuardFailEffect)
    return EffectsModule.forRoot(customEffects);
  }

  private static copy(o) {
    let output = Array.isArray(o) ? [] : {};
    for (let key in o) {
      let v = o[key];
      output[key] = typeof v === 'object' && v !== null ? copy(v) : v;
    }
    return output;
  }
}

App.module.ts

imports : [
  CustomEffectsModule.forRoot()
]
...