2017-03-16 82 views
6

我最近將ngrx商店添加到我現有的angular2應用程序中,以簡化代碼並保持共享狀態。 但是我對一個部分感到困惑,我一開始就在服務器上更新狀態,而在病房後我只是在沒有檢查服務器的情況下工作。那麼當後端發生某些變化時會發生什麼?每當我去那個網頁或有更好的方法時,我是否會檢查它? 基本上,我想知道確保您的狀態數據更新以顯示服務器數據的最佳做法是什麼?我的ngrx商店如何檢測服務器端的更改?

+0

您是否在談論服務器通知,如[Server Sent Events](https://en.wikipedia.org/wiki/Server-sent_events) –

回答

4

建議使用NGRX Effects。當您將NGRX Effects與Store一起實施時,任何HTTP副作用都將由Effects處理,而後者將使用Store中的Action來更新數據。一個Effect監聽Action並使用Action的有效載荷執行副作用(HTTP)。當效果完成後,它會使用新的有效內容調用新的Action(成功的Action或失敗的Action),從而更新Store中的數據。

example in the Effects docs它顯示Login的效果:

@Injectable() 
export class AuthEffects { 
    constructor(
    private http: Http, 
    private actions$: Actions 
) { } 

    @Effect() login$ = this.actions$ 
     // Listen for the 'LOGIN' action 
     .ofType('LOGIN') 
     // Map the payload into JSON to use as the request body 
     .map(action => JSON.stringify(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' })) 
    ); 
} 

在這個例子中,對於登錄的效果偵聽LOGIN行動。當LOGIN操作發生時,它使用操作的有效內容並執行HTTP POST。當HTTP POST返回時,它會調用動作LOGIN_SUCCESS以及有效負載的json響應,或者返回LOGIN_FAILED操作。

這樣,您的商店始終保持在任何副作用循環中,如HTTP。如果一個組件更新數據庫中的記錄,則該效應應通知該存儲,以便訂閱該數據的所有組件都可以獲取更新的數據。

希望有所幫助。

+0

感謝您的詳細解答Tyler。我部分理解你的意思。我還沒有打開NGRX效果。但我現在會這樣做,這可能會解決我的顧慮。非常感謝 –

+0

這裏有很多例子使得效果比需要的更復雜。基本上,您現有的HTTP調用可以修改爲通過偵聽某些操作,然後使用新的有效內容返回新的操作來充當效果。效果監聽的動作(例如上面示例中的「LOGIN」)可能只需要立即將未修改的有效內容返回到組件,直到該效果使用新的有效內容調用新的動作。 –

+3

效果的很好解釋,但可能無法回答這個問題?我對Q的理解:服務器上的某些變化(例如,用戶B完成了我列表中的Todo)。服務器如何發回信號(服務器事件,網絡套接字,Mq ...)以及哪些代碼會觸發商店的操作? – stwissel