NgRx 7.4.0: Uncaught TypeError: ctor не является конструктором - PullRequest
0 голосов
/ 31 января 2020

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

main.79a79285b0ad5f8b4e8a.js:33529 Uncaught TypeError: ctor is not a constructor
    at _createClass (main.79a79285b0ad5f8b4e8a.js:33529)
    at _createProviderInstance (main.79a79285b0ad5f8b4e8a.js:33501)
    at initNgModule (main.79a79285b0ad5f8b4e8a.js:33432)
    at new NgModuleRef_ (main.79a79285b0ad5f8b4e8a.js:34161)
    at Object.createNgModuleRef (main.79a79285b0ad5f8b4e8a.js:34150)
    at NgModuleFactory_.push../node_modules/@angular/core/fesm5/core.js.NgModuleFactory_.create (main.79a79285b0ad5f8b4e8a.js:36687)
    at main.79a79285b0ad5f8b4e8a.js:30069
    at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invoke (polyfills.f00ff83aa2c2b28f8bcd.js:7646)
    at Object.onInvoke (main.79a79285b0ad5f8b4e8a.js:29604)
    at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invoke (polyfills.f00ff83aa2c2b28f8bcd.js:7645)

Определение модуля выглядит следующим образом:

@NgModule({
    imports: [
        CommonModule,
        StoreModule.forRoot({settings: settingsReducer}),
        EffectsModule.forRoot([SettingsEffects])
    ],
    declarations: [/*..other declarations..*/],
    exports: [/*..other exports..*/],
    providers: [/*..other providers..*/],
})
export class MyModule {
}

зависимости в моем package.json выглядят так:

"dependencies": {
    "@ngrx/effects": "7.4.0",
    "@ngrx/router-store": "7.4.0",
    "@ngrx/store": "7.4.0",
    "@ngrx/store-devtools": "7.4.0",
    "ng2-translate": "5.0.0"
  },

Мои зависимости dev выглядят так:

"devDependencies": {
  "@angular/common": "7.2.15",
  "@angular/compiler": "7.2.15",
  "@angular/compiler-cli": "7.2.15",
  "@angular/core": "7.2.15",
  "@angular/platform-browser": "7.2.15",
  "@angular/platform-browser-dynamic": "7.2.15",
  "@angular/router": "7.2.15",
  "@compodoc/compodoc": "1.0.9",
  "@types/jasmine": "2.5.54",
  "@types/jest": "19.2.4",
  "@types/node": "7.0.43",
  "awesome-typescript-loader": "3.2.3",
  "babel-preset-env": "1.6.0",
  "codelyzer": "4.5.0",
  "core-js": "2.6.10",
  "del": "2.2.2",
  "gulp": "3.9.1",
  "gulp-header": "1.8.9",
  "gulp-rename": "1.2.2",
  "gulp-replace": "0.6.1",
  "gulp-rollup": "2.14.0",
  "gulp-shell": "0.6.3",
  "inquirer": "3.2.2",
  "jasmine-marbles": "0.6.0",
  "jest": "23.6.0",
  "jest-preset-angular": "6.0.2",
  "node-sass": "4.5.3",
  "node-sass-tilde-importer": "1.0.0",
  "node-watch": "0.5.5",
  "rollup": "0.42.0",
  "run-sequence": "1.2.2",
  "rxjs": "6.5.3",
  "rxjs-compat": "6.5.3",
  "ts-node": "7.0.1",
  "tslint": "5.20.0",
  "typescript": "3.2.4",
  "zone.js": "0.8.17"
}

Класс SettingsEffects - который я удалил в случае возникновения проблемы лежит в самом классе эффектов - выглядит следующим образом:

@Injectable()
export class SettingsEffects {

    constructor(
        private actions$: Actions
    ) {
    }

}

В своем исходном состоянии класс SettingsEffects выдает ту же ошибку.

Если удалить эту строку:

EffectsModule.forRoot([SettingsEffects])

из импорта, приложение успешно запускается; но, конечно, эффекты не работают, что бесполезно.

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

Пожалуйста помоги! Я потянул меня за волосы на целый день сейчас!

1 Ответ

0 голосов
/ 02 февраля 2020

Я считаю, что вы не можете использовать forRoot() для такого функционального модуля, как этот

@NgModule({
    imports: [
        CommonModule,
        StoreModule.forRoot({settings: settingsReducer}),
        EffectsModule.forRoot([SettingsEffects])
    ],
    declarations: [/*..other declarations..*/],
    exports: [/*..other exports..*/],
    providers: [/*..other providers..*/],
})
export class MyModule {
}

Попробуйте изменить таким образом

@NgModule({
    imports: [
        CommonModule,
        StoreModule.forFeature("settings", settingsReducer),
        EffectsModule.forFeature([SettingsEffects])
    ],
    declarations: [/*..other declarations..*/],
    exports: [/*..other exports..*/],
    providers: [/*..other providers..*/],
})

Также правильный способ сохранить хранилище для функции: укажите 2 аргумента, не передавая объект, как вы делаете сейчас

StoreModule.forRoot({settings: settingsReducer}) // this is wrong

StoreModule.forFeature("settings", settingsReducer) // this is correct
...