【问题标题】:How to have nested ngfor with dynamic calls to api如何通过对 api 的动态调用来嵌套 ngfor
【发布时间】:2020-09-18 10:53:53
【问题描述】:

我有一个对象数组,我会立即从我的 API 中返回,然后将它们显示在 .component.html 中,如下所示:

<div *ngFor="let obj of ObjectArray">
    <div>{{obj.name}}</div>
</div>

我需要对将填充第二个对象数组的每个对象进行第二次 API 调用,并且需要在 obj.name 下显示它,我尝试这样做:

<div *ngFor="let obj of ObjectArray">
    <div data-dummy="{{populateAnotherObjectArray(obj.id)}}"></div>
    <div>{{obj.name}}</div>
    <div *ngFor="let anotherObj of AnotherObjArray">
        {{anotherObj.name}}
    </div>
</div>

populateAnotherObjectArray(obj.id)component.ts 文件中的一个函数,我在其中填充了 AnotherObjArray。

现在我只能无休止地调用第二个 API。

我尝试使用 Directive 和 EventEmitter,但我没有得到任何东西。

有没有简单的方法来做到这一点?

更新:

假设我在ObjectArray 收到的第一次 API 调用:

[obj1From1stArray, obj2From1stArray]

现在我再次调用 API this.api.populate2ndArray(obj1From1stArray.id) 并进入 AnotherObjecArray

[obj1From2ndArray]

然后this.api.populate2ndArray(obj2From1stArray.id) 进入AnotherObjecArray

[obj2From2ndArray]

我在.html 页面上得到的当前答案是:

obj1From1stArray name
    obj1From2ndArray
    obj2From2ndArray
obj2From1stArray name
    obj1From2ndArray
    obj2From2ndArray

我想要什么:

obj1From1stArray name 
    obj1From2ndArray
obj2From1stArray name
    obj2From2ndArray

【问题讨论】:

  • 能不能也添加组件代码?

标签: angular typescript ngfor


【解决方案1】:

尽量避免在指令和插值中调用函数。如果您不控制更改检测策略,它们将被调用太多次。您可以在显示数据之前触发控制器中的调用。试试下面的

控制器

import { forkJoin, of } from 'rxjs';
import { catchError, switchMap } from 'rxjs/operators';

ngOnInit() {
  this.apiService.getObjectArray().pipe(
    switchMap(arr1 => {
      this.ObjectArray = arr1;
      return forkJoin(arr1.map(item => this.apiService.getAnotherObjArray(item['id'])));
    }),
    catchError(err1 => {
      // handle error
      return of(err1);
    })
  ).subscribe(
    arr2 => {
      this.ObjectArray.forEach(obj, index => this.ObjectArray['AnotherObjArray'] = arr2[index]);
    },
    err2 => {
      // handle error
    }
  );
}

模板

<div *ngFor="let obj of ObjectArray">
  <div>{{obj.name}}</div>
  <div *ngFor="let anotherObj of obj.AnotherObjArray">
    {{anotherObj.name}}
  </div>
</div>

【讨论】:

  • 虽然这确实有效,但它是多余的,因为我可以调用一个单独的方法并用简单的foreach 填充另一个数组。我现在得到的是一个二维数组,我现在可以映射到对应的obj.name,这是我做不到的。这就是为什么我需要像我的示例一样立即填充AnotherObjArray。还是我错过了什么?
  • 您还需要避免在forEach 循环中订阅,因为会有多个订阅。这里有一个您可以控制的订阅。如果您要显示对象的结构,我们可以尝试扩展此解决方案以映射到您的偏好。
  • 我已经用我想要实现的示例更新了这个问题。
  • 您可以忽略AnotherObjArray 成员变量并将其设为父对象的属性。我已经修改了代码。看看它是否适合你。
  • 这行得通!谢谢!我想补充一点,因为现在控制订阅,我还可以添加一个索引和 slice 数组以匹配确切的对象,但这是更好的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 1970-01-01
  • 2021-12-26
  • 2020-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多