我最近将ngrx商店添加到我现有的angular2应用程序中,以简化代码并维护共享状态。 但是我对一部分感到困惑,我在开始时从服务器更新了我的状态,在病房之后我只是在没有检查服务器的情况下处理状态。那么当后端的某些东西发生变化时会发生什么?我是每次检查它,我去那个页面还是有更好的方法? 基本上,我想知道确保更新状态数据以显示服务器数据的最佳做法是什么?
答案 0 :(得分:4)
建议使用NGRX Effects。当您将NGRX效果与Store一起实现时,任何HTTP副作用都由效果处理,而效果又会使用商店中的操作来更新数据。 Effect侦听Action并使用Action的有效内容执行副作用(HTTP)。效果完成后,它会使用新的有效负载调用新的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 for Login会侦听LOGIN
操作。发生LOGIN
操作时,它会使用操作的有效负载并执行HTTP POST。当HTTP POST返回时,它会使用有效负载的json响应调用操作LOGIN_SUCCESS
,或者返回LOGIN_FAILED
操作。
这样,您的商店就会始终处于任何副作用的循环中,例如HTTP。如果一个组件更新数据库中的记录,则效果应通知商店,以便订阅该数据的所有组件都获得更新的数据。
希望有所帮助。