Я начинаю использовать @ngrx и сталкиваюсь с проблемой, на которую не могу найти ответ.
Я проиллюстрировал это в этом стеке : когда игрок выбирает расу, специальность должна быть возвращена к неопределенной.
Сначала я подумал, что смогу использовать редуктор, но он не знает о магазине без инъекций.
Как мне решить эту проблему?
(Примечание: это воспроизводимый пример, я знаю, что могу добавить в свои функции вторую диспетчеризацию. Я хочу сделать это автоматически)
Код, связанный с кодом:
import { Component } from '@angular/core';
import { Store, Action, ActionReducerMap } from '@ngrx/store';
@Component({
selector: 'my-app',
template:
`
<select #race (change)="dispatchRace(race.value)" placeholder="Select a race">
<option value="Elf">Elf</option>
<option value="Orc">Orc</option>
<option value="Dwarf">Dwarf</option>
</select>
<select #spec (change)="dispatchSpecialty(spec.value)" placeholder="Select a specialty">
<option value="Warrior">Warrior</option>
<option value="Berzerkrer">Berzerkrer</option>
<option value="Healer">Healer</option>
</select>
<p>
Current race: {{ (currentRace | async) || 'None' }}
</p>
<p>
Current Spec: {{ (currentSpecialty | async) || 'None' }}
</p>
`
})
export class AppComponent {
currentRace = this.store.select('race');
currentSpecialty = this.store.select('specialty');
constructor(public store: Store<CharacterState>) { }
dispatchRace(race) {
this.store.dispatch(new SetRaceAction(race));
}
dispatchSpecialty(spec) {
this.store.dispatch(new SetSpecialtyAction(spec));
}
}
const SET_RACE = '[RACE] Set';
const SET_SPECIALTY = '[CLASS] Set';
export class SetRaceAction implements Action {
readonly type = SET_RACE;
constructor(public race: string) { }
}
export class SetSpecialtyAction implements Action {
readonly type = SET_SPECIALTY;
constructor(public specialty: string) { }
}
export function raceReducer(state: string = undefined, action: SetRaceAction): string {
return action.race || state;
}
export function specialtyReducer(state: string = undefined, action: SetSpecialtyAction): string {
return action.specialty || state;
}
export interface CharacterState {
readonly race: string;
readonly specialty: string;
}