问题描述
我在我的 angular 应用程序中使用 NGXS,在我的一些服务中,我需要在返回数据之前选择状态。 看起来很简单,我制作了这样的字段:
@Select(AuthState.token) token$!: Observable<string | null>;
并像这样使用它:
public getFieldDeFinitions(): Observable<ApiFieldDeFinition[]> {
return this.token$
.pipe(mergeMap(token => of([{}])));
}
此服务的使用状态如下:
@Action(FieldDeFinitionsGet)
get(ctx: StateContext<FieldDeFinitionsstateModel>,action: FieldDeFinitionsGet) {
return this.fieldDeFinitionsService.getFieldDeFinitions()
.pipe(tap(d => ctx.setState(
patch({
fieldDeFinitions: d
})
)))
.pipe(tap(d => console.log('fieldDeFinitions',d)));
}
问题是状态永远不会被设置。调用服务返回数据 setState
方法,但未应用状态。在控制台中,我可以看到操作已开始,但从未完成:
任何可能导致问题的线索?
当我使用 selectSnapshot
时,一切正常。
解决方法
听起来您的 http 调用实际上并未发生。您能否验证是否正在调用 setState 方法?
只是我的意见,但这是一种非常......有趣的设置标题的方式。在我看来,只使用有角度的 http 拦截器会容易得多,因为这就是它们的用途。
https://angular.io/guide/http#setting-default-headers
,可能是当你使用选择器时,数据是不可变的,导致选择器失败。使用 selectSnapshot
时,您会收到一份您所在州的副本,它允许您更改数据。