服务中的 NGXS @Select 导致问题

问题描述

我在我的 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 方法,但未应用状态。在控制台中,我可以看到操作已开始,但从未完成:

enter image description here

任何可能导致问题的线索?

当我使用 selectSnapshot 时,一切正常。

解决方法

听起来您的 http 调用实际上并未发生。您能否验证是否正在调用 setState 方法?

只是我的意见,但这是一种非常......有趣的设置标题的方式。在我看来,只使用有角度的 http 拦截器会容易得多,因为这就是它们的用途。

https://angular.io/guide/http#setting-default-headers

,

可能是当你使用选择器时,数据是不可变的,导致选择器失败。使用 selectSnapshot 时,您会收到一份您所在州的副本,它允许您更改数据。