Версии: 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"
}
}