成为ngrx
的新用户我正面临例外而不确定原因......
我正在尝试dispatch
action
并在effect
处理它,但我一直收到错误:TypeError: Actions must have a type property
操作:
export const TEST_ACTION = 'test_action';
export class TryTest implements Action {
readonly type = TEST_ACTION;
constructor(public playload: any) {
}
}
export type MyActions = TryTest;
效果:
import * as MyActions from "./myactions.actions";
@Injectable()
export class MyEffects {
@Effect()
testEffect = this.actions$
.ofType(MyActions.TEST_ACTION)
.map((action: MyActions.TryTest) => {
return 'something'
});
constructor(private actions$: Actions) {}
}
组件:
this.store.dispatch(new MyActions.TryTest({ name: 'test' }));
我正在使用:
效果:4.0.5和商店:4.0.3
答案 0 :(得分:5)
因为效果必须在最后返回一个动作。 所以你有两个选择:
从" ./ myactions.actions";
导入*作为MyActions@Injectable()
export class MyEffects {
@Effect()
testEffect = this.actions$
.ofType(MyActions.TEST_ACTION)
.map((action: MyActions.TryTest) => {
return {type:'your_action'}
});
constructor(private actions$: Actions) {}
}
答案 1 :(得分:2)
如果这有助于其他人开始......结果我没有返回ngrx在地图运营商中期待的行动。
答案 2 :(得分:0)
默认情况下,您创建的所有效果都应该发出一个动作,该动作将分派到商店。
因此,作为效果函数的结果,您需要返回类型Observable<Action>
,其中Action是@ ngrx / store的接口:
export interface Action {
type: string;
}
因此可以映射到具有属性type
的对象:
@Effect() testEffect = this.actions$
.ofType(MyActions.TEST_ACTION)
.map((action: MyActions.TryTest) => {
return {type:'action_for_test_effect'}
});
在这种情况下,您应该在减速器中支持action_for_test_effect
。
如果您不需要从效果中分派任何动作,则可以通过添加配置对象使其生效来禁用它:
@Effect({dispatch: false}) testEffect = this.actions$
.ofType(MyActions.TEST_ACTION);