2017-05-18 10 views
1

저는 Angular 및 ngrx/store 및 ngrx/effects와 함께 redux 스타일 상태 관리 디자인을 사용하고 있습니다. 나는 효과에서 작업을 반환하지 않습니다 때마다 오류가 발생합니다 : 나는이 문제를 연구하고 느릅 나무 구조에 뭔가 아무것도하지 않는 "무 조작"작업이라는 것을 발견 왜 ngrx/redux 효과가 동작을 반환해야합니까? 느릅 나무와 같은 멍청한 행동을 사용하는 것이 나쁜 습관을 고려하고 있습니까?

Cannot read property 'type' of undefined 

당신이 할 수있는 효과로 다른 액션을 연결하고 싶지 않을 때 호출합니다. 이 멍청한 행동을 도처에 부르는 것은 나에게 극단적으로 반복되는 것처럼 보입니다. 내가 따라야 할 나쁜 습관이 될지 궁금하다. 행동을 반환하지 않는 효과를 가질 수없는 이유가 있습니까? 효과의 의도는 항상 1 행동으로 다른 행동을 발동합니까? 효과를 어떻게 사용하는지 오해하고 있는지 궁금합니다.

감사합니다.

답변

7

기본적으로 ngrx/effect는 작업을 전달합니다.

효과를 '불과 잊음'으로 바꾸려면 {dispatch: false}을 인수로 @Effects() 데코레이터에 추가하면됩니다. @ngrx/effects docs에서

: 후드에서

Observables decorated with the @Effect() decorator are expected to be a stream of actions to be dispatched. Pass { dispatch: false } to the decorator to prevent actions from being dispatched.

Usage:

class MyEffects { 
    constructor(private actions$: Actions) { } 

    @Effect({ dispatch: false }) logActions$ = this.actions$ 
    .do(action => { 
     console.log(action); 
    }); 
} 

,이는 ignoreElements operator 달성된다. (Here은 관심이 있다면 ngrx/effects의 소스 코드입니다). ignoreElementsbuilt in noop function이며 효과가 실행될 때마다 called이됩니다.

요약하면 ngrx/effects에서 명시 적 noop-action이 필요하지 않습니다. noop-action을 파견하는 것은 '나쁜 습관'이라고 크게 말할 수는 없지만 ngrx를 사용할 때는 확실히 필요하지 않습니다.

+1

좋은 답변이지만 '관찰 가능한 효과를 완료 할 것입니다.'*라는 문구를 변경하는 것이 좋습니다. * *. observables에서, * complete *는 특별한 의미를 가지며'{dispatch : false} '는 observable을 완료하지 않습니다. 이 경우 효과는 한 번만 실행됩니다. – cartant

+0

물론 당신은 맞습니다. 관측 대상은 완료되지 않을 것입니다. 나는 ignoreElements가 어떻게 작동하는지 연구했고 그것은 noop-function 자체를 사용한다고 밝혀졌습니다. 내가 대답을 적절하게 변경하고 조금 더 간결하게 만들었습니다. 어쨌든 나는 문서가 말하는 것을 되풀이하고 있었기 때문에 :) 감사합니다! – mtx

+0

아,이 말이 맞습니다. 위대한, 이상한 내가 이것을 놓친 방법. 감사! – Eeks33