我们一直在try 将两个观测值合并为一个*ngIf,并在两者都发出时显示用户界面.

拿:

<div *ngIf="{ language: language$ | async, user: user$ | async } as userLanguage">
    <b>{{userLanguage.language}}</b> and <b>{{userLanguage.user}}</b>
</div>

起始:Putting two async subscriptions in one Angular *ngIf statement

就编译而言,这是可行的,但是在我的例子中,language$user$来自两个HTTP请求,而且user$似乎抛出了TypeError: _v.context.ngIf.user is undefined这样的运行时错误.

基本上,我真正想要的是(这行不通):

<div *ngIf="language$ | async as language && user$ | async as user">
    <b>{{language}}</b> and <b>{{user}}</b>
</div>

这是最好的解决方案:

  • 在组件内部订阅并写入变量
  • 将组件内部的两个观察值与withLatestFrom结合起来
  • 添加空判断{{userLanguage?.user}}

推荐答案

应使用嵌套的ngIf指令处理此情况:

<ng-container *ngIf="language$ | async as language">
  <div *ngIf="user$ | async as user">
    <b>{{language}}</b> and <b>{{user}}</b>
  </div>
<ng-container>

缺点是HTTP请求将连续执行.

为了同时执行它们,并且仍然有languageuser个变量,需要更多的嵌套:

<ng-container *ngIf="{ language: language$ | async, user: user$ | async } as userLanguage">
  <ng-container *ngIf="userLanguage.language as language">
    <ng-container *ngIf="userLanguage.user as user">
      <div><b>{{language}}</b> and <b>{{user}}</b></div>
    </ng-container>
  </ng-container>
</ng-container>

更有效的方法是在此时将逻辑从模板移动到组件类,并创建一个单独的可观察对象,例如withLatestFrom

Angular相关问答推荐

Goto锚定在嵌套容器中,具有溢出自动

嵌套formArrays的HTML迭代

布局之间的Angular 变化检测需要重新加载

使用当前选定的选项创建IF语句

如何包装NGB carousel ?

如何通过innerHtml在模板中显示动态插入的动感图标?

Angular 16-错误NG8002:无法绑定到NGModel,因为它不是输入的已知属性

HTTP拦截器在Angular 17项目中不起作用

如何将 Firebase 云消息传递 (FCM) 与 Angular 15 结合使用?

为什么初始化值为 1 的BehaviorSubject 不能分配给类型number?

Angular 测试被认为是成功的,即使有错误

Renderer2.appendChild 没有按预期工作?

Angular 项目构建仅在 GitHub Actions 上失败

Angular ngFor 索引从 1 开始 循环

如何在插值中编写条件?

带有嵌套表单数组的 Angular react式表单

模块AppModule导入的意外指令LoginComponent,请添加@NgModule 注释

相对于根目录的 SCSS 导入

Electron - 不允许加载本地资源

Angular 2:将外部js文件导入组件