You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Angular中*ngIf结合Observable的判断条件被忽略?

问题:NGXS中未初始化用户状态时*ngIf判断失效,router-outlet仍被渲染

以下是我的主组件代码:

HTML模板:

<div *ngIf="user$ | async">
  <h1>test</h1>
</div>

组件类:

@Component({
  selector: 'app-core',
  templateUrl: './core.component.html',
  styleUrls: ['./core.component.scss']
})
export class CoreComponent {
  @Select(UserState) public user$!: Observable<User>;
  constructor() {}
}

我用NGXS实现的UserState如下:

@State<UserStateModel>({
  name: 'user',
})
@Injectable()
export class UserState {
  constructor(
    private api: ApiService,
    private tokens: TokenService) { }

  @Action(GetUser)
  public get(ctx: StateContext<UserStateModel>) {
    const id = this.tokens.getAccessTokenPayload()!.sub;
    return this.api.get<User>(Endpoint.USERS, id).pipe(
      tap((user: User) => {
        ctx.setState(user);
      })
    );
  }
}

为什么在用户状态还没初始化的时候,*ngIf的判断条件就被忽略了,router-outlet仍然会被渲染?(附Redux DevTools截图)

参考Michaël的回答后我做了如下修改:

更新后的HTML模板:

<div *ngIf="user">
  <h1>test</h1>
</div>

更新后的组件类:

@Component({
  selector: 'app-core',
  templateUrl: './core.component.html',
  styleUrls: ['./core.component.scss']
})
export class CoreComponent implements OnInit {
  public user?: User;
  constructor() {}
  public ngOnInit(){
    this.store.select(UserState).subscribe((user) => {
      this.user = user;
    });
  }
}

只是出于测试尝试了这种写法,但用户状态还是会被初始化,我对此感到困惑。


内容的提问来源于stack exchange,提问作者Julien LeGa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 22:45:13