Отправка @ngrx не вызывает редуктор в приложении Angular 6 - PullRequest
0 голосов
/ 24 сентября 2018

Версии: Angular = 6.1.6, @ ngrx = 6.1.0 (через npm list).

Когда я отправляю действие @ngrx в мое приложение Angular, моя функция редуктора не вызывается.Я предполагаю, что редуктор как-то зарегистрирован или неправильно настроен?

Все транс / компилируется и обслуживается с ng serve.При отладке я вижу, что нажатие на кнопку вызывает store.dispatch(), но в редукторе «Game» ничего не происходит.

Я пытался следовать «передовым практикам» (AFAIK), имея действияих собственные классы, но это добавляет к сложности файлов, что усложняет задание такого вопроса, как этот, чтобы делиться (и трудно читать / отвечать)!

Я создал большинство файлов в приложении, используяng generate.Ниже я включу различные файлы, но для краткости исключу некоторые строки (надеюсь, сохраняя все важные элементы)

app.module.ts содержит:

import { GameComponent } from './game/game.component';
import { StoreModule } from '@ngrx/store';
import { reducers, metaReducers } from './reducers';
...
@NgModule({
  declarations: [
    AppComponent,
    GameComponent
  ],
  imports: [
    BrowserModule,
    StoreModule.forRoot(reducers, { metaReducers }),
    !environment.production ? StoreDevtoolsModule.instrument() : []
  ],
  providers: [],
  bootstrap: [AppComponent]
})

. / Redurs / index.ts содержит

import {
  ActionReducer, ActionReducerMap, createFeatureSelector, createSelector, MetaReducer
} from '@ngrx/store';
import * as fromGame from './game.reducer';

export interface State {
  game: fromGame.State;
}

export const reducers: ActionReducerMap<State> = {
  game: fromGame.reducer,
};

. / Redurs / game.reducer.ts содержит:

import { GameActionTypes, GameActions } from './game.actions'
import { Game } from '../game'

export interface State {
  game: Game;
}

export const initialState: State = {
  game: new Game()
};


export function reducer(state = initialState, action: GameActions): State {
  switch (action.type) {
    case GameActionTypes.StartNewGame:
      console.log("Reducer: Start New Game") // Never getting here!
      console.log(state)
      return state;
    default:
      return state;
  }
}

. / Redurs / game.actions.ts содержит

import { Action } from '@ngrx/store';

export enum GameActionTypes {
  StartNewGame = '[Game] New Game'
}

export class StartNewGame implements Action {
  readonly type = GameActionTypes.StartNewGame;
}

export type GameActions = StartNewGame // Will add more actions here eventually

Действие отправлено в моем игровом компоненте.Я могу подтвердить, что отправка вызывается через отладчик: . / Game / game.component.ts содержит:

export class GameComponent implements OnInit {

  constructor(
    private gameService: GameService,
    private store: Store<Game>
  ) {
  } 

  ngOnInit() {
  }

  startNewGame(): void {
    // Dispatch an Action. This should call the reducer function in game.reducer.ts
    this.store.dispatch( new fromActions.StartNewGame() );
  } 
  ...

package.json

{
  "name": "my-game",
  "version": "0.0.0",
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "^6.1.0",
    "@angular/common": "^6.1.0",
    "@angular/compiler": "^6.1.0",
    "@angular/core": "^6.1.0",
    "@angular/forms": "^6.1.0",
    "@angular/http": "^6.1.0",
    "@angular/platform-browser": "^6.1.0",
    "@angular/platform-browser-dynamic": "^6.1.0",
    "@angular/router": "^6.1.0",
    "@ngrx/store": "^6.1.0",
    "core-js": "^2.5.4",
    "rxjs": "^6.0.0",
    "zone.js": "~0.8.26"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "~0.7.0",
    "@angular/cli": "~6.1.5",
    "@angular/compiler-cli": "^6.1.0",
    "@angular/language-service": "^6.1.0",
    "@ngrx/schematics": "^6.1.0",
    "@ngrx/store-devtools": "^6.1.0",
    "@types/jasmine": "~2.8.6",
    "@types/jasminewd2": "~2.0.3",
    "@types/node": "~8.9.4",
    "codelyzer": "~4.2.1",
    "jasmine-core": "~2.99.1",
    "jasmine-spec-reporter": "~4.2.1",
    "karma": "~1.7.1",
    "karma-chrome-launcher": "~2.2.0",
    "karma-coverage-istanbul-reporter": "~2.0.0",
    "karma-jasmine": "~1.1.1",
    "karma-jasmine-html-reporter": "^0.2.2",
    "protractor": "~5.4.0",
    "ts-node": "~5.0.1",
    "tslint": "~5.9.1",
    "typescript": "~2.7.2"
  }
}
...