Унаследованные от ngRx классы эффектов не работают

У меня есть два приложения в монорепозитории, одно будет бесплатным подмножеством другого, поэтому все функции бесплатного приложения включены в несвободное.

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

Вот установка:

  • core.effects.ts включает класс CoreEffects, который определяет 2 ванильных эффекта - LoadLayout и ToggleSidebar.
  • not-free.effects.ts включает класс NotFreeEffects, который расширяет класс CoreEffects
  • free.effects.ts включает класс FreeEffects, который расширяет класс CoreEffects и не определяет никаких дополнительных эффектов.
  • В моем модуле я импортирую модуль эффектов и указываю унаследованный класс эффектов: 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)
    );

Когда я запускаю любое приложение с этой настройкой, все работает. Я добавил операторы журнала в свои редукторы, чтобы я мог видеть, когда сообщение LoadLayoutSuccess передается и обрабатывается в редукторе.

Как только я добавляю еще один эффект к классу NotFreeEffect (т.е. тот, который не используется бесплатным приложением), основные эффекты больше не обрабатываются - мои операторы журнала в редукторах больше не указывают, что LoadLayoutSuccess когда-либо отправляется. Ничего не изменилось, кроме добавления к классу not-free совершенно не относящегося к нему Эффекта. Бесплатное приложение продолжает работать, платное - нет. Если я удалю этот дополнительный эффект из not-free, он снова начнет распознавать основные эффекты.

Что мне не хватает? Можно ли унаследовать такие классы эффектов?

Подробности:

  • Угловой интерфейс командной строки: 1.7.1
  • Узел: 8.9.4
  • ОС: win32 x64
  • Angular: 5.2.7 ... анимации, общие, компилятор, компилятор-cli, ядро, формы ... язык-сервис, платформа-браузер, платформа-браузер-динамический ... маршрутизатор

  • @ angular / cdk: 5.2.5

  • @ angular / cli: 1.7.1
  • @ угловой / материал: 5.2.5
  • @ angular-devkit / оптимизатор сборки: 0.3.2
  • @ angular-devkit / ядро: 0.3.2
  • @ angular-devkit / схемы: 0.3.2
  • @ ngtools / json-схема: 1.2.0
  • @ ngtools / webpack: 1.10.1
  • @ schematics / angular: 0.3.2
  • @ schematics / обновление пакета: 0.3.2
  • машинопись: 2.6.2
  • веб-пакет: 3.11.0
  • ngrx: 5.2.0
  • @ nrwl / nx: 1.0.3

Спасибо,

TTE


person TimTheEnchanter    schedule 25.05.2018    source источник


Ответы (3)


Ngrx ‹8:

Это известная проблема с различными симптомами. По сути, использование расширений в контексте эффектов ошибочно. По моему опыту, эффекты базового класса работают до тех пор, пока у вас нет никаких эффектов в подклассе.
https://github.com/ngrx/platform/issues/586
https://github.com/ngrx/platform/issues/1234

ОБНОВЛЕНИЕ: с момента этого коммита

person dummdidumm    schedule 08.08.2018
comment
Хорошо, это не тот ответ, на который я надеялся, но я не буду стрелять в посыльного. Спасибо, что сообщили мне, что я не сумасшедший. - person TimTheEnchanter; 08.08.2018

Вы можете попробовать этот способ.

abstract class GenericEffects {

 protected constructor(
   protected actions$: Actions,
 ) {}

 protected _someGenericEffect$ = this.actions
  .pipe(
      ofType('GENERIC_ACTION')
      ...
    )
}


class SpecificEffects extends GenericEffects {
    @Effect()
    someSpecificEffect$ = this._someGenericEffect$;
}

person Sergiy Pavlichenko    schedule 31.01.2019

NgRx предоставляет функцию createEffect, начиная с версии 8.0.0_bd06.0"#diff_4ac32a78649ca5bdol_0">.

Чтобы эффекты NgRx работали в унаследованных классах, просто замените декорированные эффекты новыми функциями createEffect, как показано в приведенном ниже фрагменте:

import { createEffect, ofType } from '@ngrx/effects';

loadLayout$ = createEffect(() => this.actions$...);

Вы можете установить последнюю бета-версию, запустив (вам также может потребоваться обновить rxjs до @latest):

npm install --save @ngrx/store@next @ngrx/effects@next @ngrx/schematics@next @ngrx/store-devtools@next
person Igor Pavlichenko    schedule 20.05.2019