2017-03-16 69 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