Ngrx 效果:输出未添加到动作流中

用户4676340

这个问题可以在这个 stackblitz 中重新解决

这个例子很简单:用户选择一个种族和一个专业。

我希望在选择比赛时,专业被重置(ed ?)。

为此,我创建了一个效果:

@Effect()
raceChange = this.actions
  .pipe(
    ofType(SET_RACE),
    mapTo(new SetSpecialtyAction(''))
  );

但是该操作并未添加到流中。有人可以解释我为什么吗?(我是@ngrx 的新手,所以请仔细!)

PS:我知道我可以使用上一个问题的解决方案,但我正在尝试学习 ngrx 基础知识。

stackblitz 组件的代码:

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.raceStore.select('race');
  currentSpecialty = this.specStore.select('specialty');

  constructor(
    public raceStore: Store<RaceState>,
    public specStore: Store<SpecialtyState>,
    ) {
      this.currentRace.subscribe(x => console.log('race : ', x));
      this.currentSpecialty.subscribe(x => console.log('spec : ', x))
    }

  dispatchRace(race) {
    this.raceStore.dispatch(new SetRaceAction(race));
  }

  dispatchSpecialty(spec) {
    this.specStore.dispatch(new SetSpecialtyAction(spec));
  }
}


export const SET_RACE = '[RACE] Set';
export 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 RaceState {
  readonly race: string;
}

export interface SpecialtyState {
  readonly specialty: string;
}
伊本杰伦

所述mapTo发射映射到串,使用map将映射到这将被分派的动作。

为了使您的示例工作,我更改了两件事:

1- 替换效果中mapToby map

@Effect()
raceChange = this.actions
   .pipe(
     ofType(SET_RACE),
     map(() => new SetSpecialtyAction(''))
);

2-更改忽略空值的减速器:

export function specialtyReducer(state: string = undefined, action: SetSpecialtyAction): string {
  return action.specialty;
}

const value = '' || 'Not Empty';
console.log(value);

这是一个工作叉。

您还可以使用switchMap并返回一个数组 fo actions映射到多个操作:

@Effect()
raceChange = this.actions
   .pipe(
     ofType(SET_RACE),
     switchMap(() => [new SetSpecialtyAction(''), ...])
);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在 ngrx 中添加 SUCCESS 动作

来自分类Dev

NGRX 8将元素添加到存储中的数组

来自分类Dev

NgRx效果mergeMap方法

来自分类Dev

ngrx从效果更新状态

来自分类Dev

在rxjs / ngrx效果中链接动作的正确方法是什么

来自分类Dev

如何从NgRx中的单个效果分派多个动作?

来自分类Dev

有条件地返回 NgRx 效果中的动作

来自分类Dev

ngrx /动作/效果后UI通知存储

来自分类Dev

我的 ngrx 效果不会触发动作

来自分类Dev

Ngrx效果并行http调用

来自分类Dev

ngrx:商店INIT操作的效果

来自分类Dev

NGRX 效果/Firebase (Firestore) 错误

来自分类Dev

store.select 的 ngrx 效果

来自分类Dev

使用延迟测试 NGRX 效果

来自分类Dev

分派动作时的ngrx路由

来自分类Dev

NgRx-选择效果中的AppState

来自分类Dev

在NGRX中以什么顺序执行效果

来自分类Dev

如何在 ngrx 中测试效果?

来自分类Dev

NgRx-在ngOnInit中,动作被分派多次

来自分类Dev

如何使用ngrx / effects执行多个相关的操作/效果/动作

来自分类Dev

测试失败动作-大理石-NGRX效果

来自分类Dev

如何有条件地从ngrx中的效果分派多个动作

来自分类Dev

需要帮助来了解此Ngrx效果

来自分类Dev

从NgRx效果调用API时捕获错误

来自分类Dev

正确处理ngrx效果catchError

来自分类Dev

NgRx效果仅执行一次

来自分类Dev

需要帮助来了解这种Ngrx效果

来自分类Dev

Angular with ngrx 和 typescript 问题与效果

来自分类Dev

如何在angular Ngrx中的效果中传递ID