NGXS 状态不变
NGXS State not changing
可能有人知道为什么 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 })
}
)
}
实际上,状态正在发生变化,但您没有看到,因为您 return 订阅尚未完成。换句话说 - 一旦 returned 可观察对象的订阅完成,您将看到正在调度的操作。
如评论中所述,returned 操作的可观察对象正在后台订阅,因此无需再次订阅。
话虽如此,你可以在管道中传递 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 }))
);
}
可能有人知道为什么 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 })
}
)
}
实际上,状态正在发生变化,但您没有看到,因为您 return 订阅尚未完成。换句话说 - 一旦 returned 可观察对象的订阅完成,您将看到正在调度的操作。
如评论中所述,returned 操作的可观察对象正在后台订阅,因此无需再次订阅。
话虽如此,你可以在管道中传递 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 }))
);
}