NGRX: TypeError: Действия должны иметь свойство типа

Поскольку я новичок в 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


person Thibs    schedule 11.09.2017    source источник
comment
Я думаю, вам нужно добавить парантез (()), когда вы хотите отправить новое действие, иначе конструктор не вызывается: this.store.dispatch(new MyActions.TryTest({ name: 'test' })());   -  person David    schedule 11.09.2017
comment
Спасибо Дэвиду за время, но я думаю, что вызываю конструктор и передаю объект {name: test}   -  person Thibs    schedule 11.09.2017
comment
Ой, извините, я неправильно прочитал ваш код! ничего!   -  person David    schedule 11.09.2017


Ответы (3)


Если это поможет кому-то другому начать ... Оказывается, я не возвращал действие, которое ngrx ожидает в операторе карты.

person Thibs    schedule 11.09.2017
comment
то же самое случилось со мной, я возвращался (мое действие) вместо моего действия - person Vikas; 23.06.2019

потому что эффект должен возвращать действие в конце. Итак, у вас есть два варианта:

  1. вернуть объект {type: string}
  2. вернуть новое действие ()

    import * as MyActions from "./myactions.actions";
    
    @Injectable()
    export class MyEffects {
        @Effect()
        testEffect = this.actions$
            .ofType(MyActions.TEST_ACTION)
            .map((action: MyActions.TryTest) => {
                return {type:'your_action'}
            });
    
        constructor(private actions$: Actions) {}
    }
    
person Engalar Liu    schedule 17.11.2017
comment
Пожалуйста, делайте не только почтовый индекс. Вместо этого добавьте объяснение. - person tmuecksch; 17.11.2017

по умолчанию предполагается, что все создаваемые вами эффекты запускают действие, которое отправляется в магазин. Таким образом, в результате работы функции эффекта вам необходимо вернуть тип 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);
person kuceraf    schedule 23.02.2020