【问题标题】:*ngFor depending on 2 arrays matching values*ngFor 取决于 2 个匹配值的数组
【发布时间】:2020-04-02 08:38:02
【问题描述】:

我在理解如何执行 *ngFor 循环时遇到一些问题,这取决于我在 2 个不同数组中的值,例如:

数组:label_name

数组:total_by_level

我正在执行 ngFor,我希望 ngFor 渲染在这 2 个数组中具有值的行,在这里,我的 ngFor 应该渲染:Network Main:1537.82,Drops Drop Aluminum:21752.15 和 Misc VANNE: 19541 尊重他们的价值观

我尝试过使用 foreach 和 filter,但我在网上找到的解决方案都没有适合我的问题。

如果有人知道我需要去哪里/我需要做什么,我将不胜感激。

先谢谢了

代码示例:

HTML:

<div class="container dpf wid">
  <form [formGroup]="cartForm">
        <div *ngFor="let levels of total_by_level"
             style="display: contents">
          <div *ngFor="let level_names of label_name">
          <a class="flex1 bold pointer" >TOTAL {{level_names}} {{levels[2][3]}}</a>
        </div>
 </form>
</div>

component.ts:

constructor(private formBuilder: FormBuilder,
              private service: QuotationMenuService) { }

  cartForm: FormGroup;
  quotArray: any;
  quotDetails: any;
  cartDetails: any;
  labels: any;
  label_name: any;
  total_by_level: any;
  array: any;

  ngOnInit(){
    this.requiredFields();
    this.service.getStructure().subscribe(res => {
      this.labels = res.parts;
      this.label_name = Array(res.labels_levels);
      console.log(this.label_name);
    });
    this.initQuot();
  }

  ngOnChanges() {
    this.initQuot();
  }

  initQuot(){
    this.service.checkExistQuot().subscribe(res => {
      this.quotArray = res;
      this.quotDetails = res.quotation.quotationdetail;
      this.cartDetails = Array(res.cart);
      console.log(this.quotDetails);
      console.log(this.cartDetails);
      this.total_by_level = Array(res.cart.total_by_level);
      console.log(this.total_by_level);
      console.log(res);
    });
  }

  get f() {
    return this.cartForm.controls;
  }

  requiredFields(){
    this.cartForm = this.formBuilder.group(
      {

      }
    )
  }

这是我页面上的实际样子:

【问题讨论】:

    标签: arrays angular typescript


    【解决方案1】:

    我想说输入数组需要重新格式化。这无疑是解决原本可以避免的问题的解决方案。

    也就是说,你可以试试下面的循环

    控制器

    for (const levelKey in this.total_by_level[0]) {
      if (this.total_by_level[0].hasOwnProperty(levelKey)) {   // <-- add check here to avoid error
        const key = this.label_name[0][levelKey] + ' ' + this.label_name[0][Object.keys(this.total_by_level[0][levelKey])[0]];
        const value = this.total_by_level[0][levelKey][Object.keys(this.total_by_level[0][levelKey])[0]];
        this.output_object[key] = value;
      }
    }
    

    output_object = Object.create(null).

    并在模板中显示

    <div *ngFor="let output of output_object | keyvalue">
      {{ output.key }}: {{ output.value }}
    </div>
    

    工作示例:Stackblitz

    【讨论】:

    • 您好!首先,感谢您的出色回答,我得到“this.total_by_level[0]”的“可能对意外(自定义/继承)成员进行迭代,可能缺少 hasOwnProperty 检查”的原因你知道我是否应该编辑数组已经循环 [0] 内的值?
    • 如果我没记错的话,它应该只是一个警告并且代码应该运行。不过,您也可以在循环中包含它所需的检查。我已经更新了答案和 Stackblitz。请检查我的代码。
    • 谢谢,数组无法在 this.total_by_level[0] 的 [0] 部分循环,我得到:错误类型错误:无法读取未定义的属性 '0',可以t 我只循环进入数据而不是我的数组创建 [0] 级别?
    • 我使用了您在屏幕截图中发布的对象数组。可能实际对象不同。应该是一个简单的修复。控制台记录对象,检查结构并从上面的代码中删除 [0] 部分,如果它不是一个数组。基本实现保持不变。
    • 好的!谢谢你的帮助 !我将其标记为答案,因为问题现在来自我的数据
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 2022-06-14
    • 2012-12-12
    • 1970-01-01
    • 2017-03-11
    • 2022-01-26
    • 2023-03-03
    相关资源
    最近更新 更多