2016-08-25 9 views
6

में किसी क्रिया को प्रेषित नहीं करते समय अंतहीन पाश में फंस गया मैं राज्य प्रबंधन के लिए कोणीय 2 और ngrx/store और ngrx/प्रभावों का उपयोग कर रहा हूं।एनजीआरएक्स/प्रभाव

जब कोई निश्चित कार्रवाई विफल हो जाती है तो मैं एक त्रुटि संदेश दिखाना चाहता हूं लेकिन ऐसा लगता है कि मैं इस कार्य को @Effects() ब्लॉक में नहीं कर सकता। निम्न देखें:

@Effect() selectOfficeFail$ = this.actions$ 
    .ofType(SelectOfficeActions.LOAD_FAIL) 
    .do(() => { 
    alert('Error! No offices found!'); // I keep entering here 
    }); 

जब ऊपर दिया गया कोड चेतावनी चलाता है तो ब्राउज़र क्रैश होने तक अनगिनत बार चला जाता है। ऐसा लगता है कि @Effect()को एक नया dispatch() लौटा है लेकिन मुझे समझ में नहीं आता है। और उपरोक्त चेतावनी() उपरोक्त कई बार क्यों चलती है?

संपादित करें: मैं नहीं भेजने SelectOfficeActions.LOAD_FAIL कई बार कर रहा हूँ। केवल एक बार

उत्तर

4

समस्या यह है कि do, कार्रवाई अपने प्रभाव के माध्यम से प्रवाह करने की अनुमति देता है और कार्रवाई तो भेजा जाता है, फिर से दुकान कर रहा है। आप filter इस्तेमाल कर सकते हैं ऐसा होने से रोकने के लिए:

@Effect() selectOfficeFail$ = this.actions$ 
    .ofType(SelectOfficeActions.LOAD_FAIL) 
    .do(() => { 
    alert('Error! No offices found!'); // I keep entering here 
    }) 
    .filter(() => false); 
0

हाँ आप सही हैं @effect को एक नई कार्रवाई भेजने की आवश्यकता है, लेकिन मुझे लगता है कि आपके एप्लिकेशन तर्क में कुछ गड़बड़ है।

आप एक घटक या सेवा लेकिन में SelectOfficeActions.LOAD_FAIL कार्रवाई भेजने नहीं किया जाना चाहिए बल्कि एक एक लोड कार्रवाई जो एक @Effect और बदले में प्रभाव का आह्वान एक LOAD_COMPLETE या LOAD_FAIL मानदंडों के आधार पर डिस्पैचिज।

कुछ इस example पुस्तकालयों से की तरह GitHub

@Effect() login$ = this.updates$ 
     // Listen for the 'LOGIN' action 
     .whenAction('LOGIN') 
     // Map the payload into JSON to use as the request body 
     .map(update => JSON.stringify(update.action.payload)) 
     .switchMap(payload => this.http.post('/auth', payload) 
     // If successful, dispatch success action with result 
     .map(res => ({ type: 'LOGIN_SUCCESS', payload: res.json() })) 
     // If request fails, dispatch failed action 
     .catch(() => Observable.of({ type: 'LOGIN_FAILED' })); 
    ); 
9

[अद्यतन] अब जब कि ऐसा करने के लिए सबसे अच्छा तरीका है dispatch विकल्प इस तरह उपयोग करने के लिए है: "इस कार्रवाई के प्रति प्रतिक्रिया करता

@Effect({dispatch: false}) selectOfficeFail$ = this.actions$ 
    .ofType(SelectOfficeActions.LOAD_FAIL) 
    .do(() => { 
     alert('Error! No offices found!'); // I keep entering here 
    }); 

इसका मतलब है लेकिन एक और मत भेजें "।

+0

वहां का सबसे अच्छा समाधान। –