【问题标题】:Angular *ngif with Observable and data from async calls带有 Observable 的 Angular *ngif 和来自异步调用的数据
【发布时间】:2023-03-12 16:24:01
【问题描述】:

我正在使用一些 REST 服务来收集数据,然后在我的组件代码中更改 Observable 的值。我正在尝试使用 *ngIf 根据结果显示/隐藏 div 标签。但是,它不起作用,*ngIf 没有根据对 Observable 的更改进行更新。

我必须触发变更检测吗?在 Angular 7 中实现这一目标的最佳方法是什么?这是我试过的一个例子:

HTML:

<div *ngIf="isAnimal$">
     <p>animal</p>
</div>

组件:

public isAnimal$: Observable<boolean> = of(false);
...
ngOnInit() {
  checkAnimal();
}

private checkAnimal() {
  this._dataService.getData()
      .subscribe((result) => {
         if (result === 'animal') {
           this.isAnimal$ = of(true);
         }
      });
}

我也尝试过创建一个简单的服务,但也没有用。像这样:Angular *ngIf binding to function

【问题讨论】:

    标签: angular rxjs observable angular7


    【解决方案1】:

    我建议如下:

    HTML:

    <div *ngIf="isAnimal">
         <p>animal</p>
    </div>
    

    组件:

    public isAnimal: boolean = false;
    
    ngOnInit() {
      checkAnimal();
    }
    
    private checkAnimal() {
      this._dataService.getData().subscribe(
        (result) => {
           if (result === 'animal') {
             this.isAnimal = true;
           }
        },
        (error) => {
          console.log(error);
        }
     );
    }
    

    我不确定,但我认为您可以使用异步管道来代替您的实现:

    <div *ngIf="isAnimal$ | async">
         <p>animal</p>
    </div>
    

    您的解决方案不起作用的原因是isAnimal$ 是一个必须解决的可观察对象。异步管道可以做到这一点,但老实说,我更喜欢第一个解决方案。在您的订阅中创建另一个可观察的 of(true) 对我来说似乎并不自然。

    【讨论】:

    • 这是我尝试的第一种方法。我正在记录结果:“animal : true”,但 *ngIf 没有更改 HTML。我怀疑 *ngIf 没有等待异步调用返回。异步管道不适用于布尔值。
    • @beachCode 第一种方法适用于 100%,*ngIf 自动监听传递的值的变化,这是一个布尔值。第二种方法也应该有效。不要忘记 isAnimal$ 在这里不是布尔值,它是可观察的。当它被解析时,它应该是一个布尔值。
    • 我刚刚注意到一些奇怪的事情。我正在使用插值来显示一些数据({{name}} 并且它也没有更新......很奇怪。这个组件是怎么回事?
    • 所以这里的问题似乎是由 Google API 调用引起的错误。我最初看不到它,但是当我更改组件行为时它出现了。该错误似乎导致了我在插值和 *ngif 中出现的问题无法正常工作。这是来自控制台的错误的第一部分:ERROR DOMException: Failed to execute 'querySelector' on 'Document': '#scope=openid email profile googleapis.com
    • 您应该在订阅时添加错误处理(参见我上面的编辑),这可能有助于找到问题。 :)
    猜你喜欢
    • 2020-02-05
    • 2016-11-04
    • 2018-09-10
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 2021-06-09
    相关资源
    最近更新 更多