如何在Angular

时间:2017-08-22 13:32:57

标签: javascript angular typescript ecmascript-6

这是关于我在工作中发现的一个有趣问题。

如果你还不知道。我在谈论Angular 2 +

问题

因此,您希望显示列表的标记,此列表的值来自后端,并且由于某种原因而不是您收到类似的旧对象数组。

    { 
  "car" : 
    { 
       "color" : "red",
       "model" : "2013"
    },
   "motorcycle": 
    { 
       "color" : "red",
       "model" : "2016"
    },
   "bicycle": 
    { 
       "color" : "red",
       "model" : "2011"
    }
}

然后您尝试使用* ngFor,但会显示一条错误消息:

Cannot find a differ supporting object '[object Object]' of type 'object'. NgFor only supports binding to Iterables such as Arrays.

你可能会在后端修复它,所以你得到一个对象数组,但是没有时间没有时间。你不担心孩子,我有我们。

6 个答案:

答案 0 :(得分:49)

在Angular 6.1中引入了KeyValuePipe,它允许您迭代对象属性:

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

文档:https://angular.io/api/common/KeyValuePipe

答案 1 :(得分:16)

我不知道这是否安全,但对于这些简单的情况我不喜欢管道解决方案,所以我通常使用:

<div *ngFor="let k of objectKeys(yourObject)">
    {{yourObject[k].color}}
</div>

并在控制器中:

objectKeys(obj) {
    return Object.keys(obj);
}

这是一个非常常见的情况,我不明白为什么没有像Angular.js 1.x

这样的标准实现

答案 2 :(得分:10)

更好的解决方案是使用像这样的管道:

import { Pipe, PipeTransform } from '@angular/core';

/**
 * Convert Object to array of keys.
 */
@Pipe({
  name: 'appProperties'
})
export class PropertiesPipe implements PipeTransform {

  transform(value: {}): string[] {

    if (!value) {
      return [];
    }

    return Object.keys(value);
  }
}

然后在你的模板中:

<div *ngFor="let property of response | appProperties">
    <div *ngFor="let item of response[property]">
         {{item.something}}
    </div>
</div>

答案 3 :(得分:2)

    <div *ngFor="let item of donation_list | keyvalue">
        <div class="donation-box">
             <Label class="donation-label">Date : {{item.value.PaymentDate}}</Label>
             <Label class="donation-label">Time : {{item.value.PaymentTime}}</Label>

        </div>
   </div>

如果对象内部具有更多属性,则可以这样使用。

答案 4 :(得分:1)

解决方案

在一个完美的世界里,你会得到一系列物体,因为世界并不总是完美的。你想要做的是将所有这些对象存储在一个数组中。这是一个简单易用的JavaScript解决方案。

第1步。获取所有对象键。使用Object.keys。此方法返回给定对象自己的可枚举属性的数组。

第2步。创建一个空数组。这是所有属性都将存在的地方,因为你的新ngFor循环将指向这个数组,我们必须全部捕获它们。

第3步。迭代抛出所有密钥,并将每个密钥推入您创建的阵列。

以下是代码中的样子。

// Evil response in a variable. Here are all my vehicles.
let evilResponse = { 
  "car" : 
    { 
       "color" : "red",
       "model" : "2013"
    },
   "motorcycle": 
    { 
       "color" : "red",
       "model" : "2016"
    },
   "bicycle": 
    { 
       "color" : "red",
       "model" : "2011"
    }
}
// Step 1. Get all the object keys.
let evilResponseProps = Object.keys(evilResponse);
// Step 2. Create an empty array.
let goodResponse = [];
// Step 3. Iterate throw all keys.
for (prop of evilResponseProps) { 
    goodResponse.push(evilResponseProps[prop]);
}

然后你可以将goodResponse分配给你试图首先迭代的类属性。

那是所有人。

答案 5 :(得分:0)

使用Object.values从对象中获取常规数组。 Object.keys似乎是很多不必要的工作。

参考: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values