首页 > 解决方案 > NGXS 状态不变

问题描述

可能有人知道为什么 NGXS 状态不能在 HttpClient POST 请求中改变。

ctx.patchState()

仅适用于 HTTP POST 请求之外。

    @Action(SignIn)
    signin(ctx: StateContext<AppStateModel>, { payload }: SignIn) {

        // ctx.patchState({isLoggedIn:true}) this works!

        return this.api$.signin(payload)
            .pipe(
                tap((user: User) => {
                    console.log(user);
                    ctx.patchState({ isLoggedIn: true })

                })
            )
            .subscribe(
                (user: User) => {
                    ctx.patchState({ isLoggedIn: true })

                }
            )
    }

标签: javascriptangularngxs

解决方案


实际上,状态正在发生变化,但是您看不到它,因为您返回了尚未完成的订阅。换句话说 - 一旦返回的 observable 的订阅完成,您将看到该操作被分派。

正如评论中提到的,返回的操作的可观察对象正在后台订阅,因此无需再次订阅。

话虽如此,您可以通过take(1)管道。

它的作用是在触发一次后完成对 observable 的订阅。

    @Action(SignIn)
    signin(ctx: StateContext<AppStateModel>, { payload }: SignIn) {
        return this.api$.signin(payload)
            .pipe(
                take(1), // <-- Add that
                tap((user: User) => ctx.patchState({ isLoggedIn: true }))
            );
    }


推荐阅读