NGRX:TypeError:Actions必须具有type属性

时间:2017-09-11 15:10:14

标签: angular ngrx ngrx-effects

成为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

3 个答案:

答案 0 :(得分:5)

因为效果必须在最后返回一个动作。 所以你有两个选择:

  1. 返回{type:string}对象
  2. 返回一个新的Action()
  3. 从" ./ 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);