Унаследованные ngRx классы эффектов не работают - PullRequest
0 голосов
/ 25 мая 2018

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

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

Вот наборup:

  • 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 когда-либо отправлялся. Ничего не изменилось, кроме добавления совершенно несвязанного эффекта в несвободный класс .Бесплатное приложение продолжает работать, несвободное - нет.Если я уберу этот дополнительный эффект из несвободного, он снова начнет распознавать базовые эффекты.

Чего мне не хватает?Должны ли вы иметь возможность наследовать классы эффектов, как это?

Детали:

  • Угловой CLI: 1.7.1
  • Узел: 8.9.4
  • ОС: win32 x64
  • Angular: 5.2.7 ... анимации, общие, компилятор, compiler-cli, core, forms ... language-service, platform-browser, platform-browser-динамический ... маршрутизатор

  • @ angular / cdk: 5.2.5

  • @ angular / cli: 1.7.1
  • @ angular/ материал: 5.2.5
  • @ angular-devkit / build-optimizer: 0.3.2
  • @ angular-devkit / core: 0.3.2
  • @ angular-devkit/ схема: 0.3.2
  • @ ngtools / json-схема: 1.2.0
  • @ ngtools / webpack: 1.10.1
  • @ схема / угловая: 0.3.2
  • @ schematics / package-update: 0.3.2
  • машинопись: 2.6.2
  • webpack: 3.11.0
  • ngrx: 5.2.0
  • @ nrwl / nx: 1.0.3

Спасибо,

TTE

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

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

abstract class GenericEffects {

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

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


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

0 голосов
/ 20 мая 2019

NgRx предоставляет функцию createEffect начиная с версии 8.0.0-beta.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
0 голосов
/ 08 августа 2018

Ngrx <8: </h1> Это известная проблема с различными симптомами.По сути, использование extends в контексте эффектов является ошибкой.Мой опыт показывает, что эффекты в базовом классе работают до тех пор, пока у вас нет никаких эффектов в подклассе.
https://github.com/ngrx/platform/issues/586
https://github.com/ngrx/platform/issues/1234 ОБНОВЛЕНИЕ: Поскольку этот коммит https://github.com/ngrx/platform/commit/e7ae8a228ee4338b6beac4baf0bba745fa32c917#diff-708a6e5fc1424e81075508aee61cb59f эффекты больше не работают вообще, когда подклассы.Причина «hasOwnProperty» - использование вместо прямого доступа к свойству эффект-метаданных. К сожалению, команда Ngrx не хочет изменять это поведение
https://github.com/ngrx/platform/pull/890 Для обходного путисм. этот ответ . Ngx> = 8

Теперь это возможно с помощью функции createEffect (кажется, они реализовали ее иначе).Также см. этот ответ

...