Angular2遍历对象数组

3

我有一个如下所示的数组:

causes: any= [
{
    'Specification': {
        'Missing':false,
        'Unclear':false,
        'Wrong':false,
        'Changed':false,
        'Better Way':false,
    },
    'Design': {
        'Missing':false,
        'Unclear':false,
        'Wrong':false,
        'Changed':false,
        'Better Way':false,
    },
    'Code': {
        'Missing':false,
        'Unclear':false,
        'Wrong':false,
        'Changed':false,
        'Better Way':false,
    },
    'Documentation': {
        'Missing':false,
        'Unclear':false,
        'Wrong':false,
        'Changed':false,
        'Better Way':false,
    },
}]

我该如何在模板中遍历它?我尝试了以下代码:

<div class="mdl-grid">
    <div *ngFor=" let chunk of causes | chunks: 2; let j = index; " class="mdl-cell mdl-cell--4-col">
        <label *ngFor=" let cause of chunk| values " #checkbox class="mdl-checkbox mdl-js-checkbox">
            <input type="checkbox" name="causes" class="mdl-checkbox__input">
            <span class="mdl-checkbox__label">{{cause}}</span>
        </label>
    </div>
</div>

但它仍然给了我 [object Object]。 我正在尝试为每个原因填充这5个复选框并针对它们进行操作。

1
ngFor只接受数组,但是从我所看到的内容来看,你正在尝试迭代一个对象。 - Chrillewoodz
let chunk of causes[0] 应该能够澄清情况。 - borkovski
2个回答

5
在您提供的代码中,数组内只有一个对象。
我猜想您的数组应该像这样:
causes: any = [
    {
        name: 'Specification',
        values: {
            'Missing': false,
            'Unclear': false,
            'Wrong': false,
            'Changed': false,
            'Better Way': false,
        },
    },
    {
        name: 'Design',
        values: {
            'Missing': false,
            'Unclear': false,
            'Wrong': false,
            'Changed': false,
            'Better Way': false,
        },
    },
    {
        name: 'Code',
        values: {
            'Missing': false,
            'Unclear': false,
            'Wrong': false,
            'Changed': false,
            'Better Way': false,
        },
    },
    {
        name: 'Documentation',
        values: {
            'Missing': false,
            'Unclear': false,
            'Wrong': false,
            'Changed': false,
            'Better Way': false,
        },
    }
]

你的HTML应该长这样。
    <div class="mdl-grid">
        <div *ngFor=" let chunk of causes" class="mdl-cell mdl-cell--4-col">
            <div>Checkboxes for {{chunk.name}}</div>
            <div *ngFor=" let cause of chunk.values | keys">
               <label  #checkbox class="mdl-checkbox mdl-js-checkbox">
                   <input type="checkbox" [name]=" chunk.name + '_' + cause" class="mdl-checkbox__input">
                    <span class="mdl-checkbox__label">{{cause}}</span>
               </label>
            </div>
        </div>
    </div>

“keys pipe”是一个自定义管道,返回对象的键,它是一个字符串数组。管道的代码如下:

管道

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

@Pipe({
    name: 'keys',
    pure: false
})
export class KeysPipe implements PipeTransform {
    transform(value, args: string[]): any {
        return Object.keys(value);
    }
}

这是一个更好的解决方案,只是它只打印 [] false,[] true 这个代码,并不像:五个复选框的规范,每个复选框都有一个标签 Missing,Unclear 等。 - Thinker
太好了!我已经完成了 :) 感谢您建议更改数组结构。这样更加合理! - Thinker
谢谢!很高兴能帮到你。 - Mario Petrovic
如果我理解您正确,我创建了一个Plunker示例:https://plnkr.co/edit/rOuKEDHLOCfBOBjwB2Xi - Mario Petrovic
是的,正确,就是那样!谢谢! - Thinker

2

默认情况下,无法遍历对象。但是,您可以使用类似下面的自定义管道。

  import { PipeTransform, Pipe } from '@angular/core';
  @Pipe({name: 'keys'})
  export class KeysPipe implements PipeTransform {
    transform(value, args:string[]) : any {
     let keys = [];
     for (let key in value) {
       keys.push(key);
      }
      return keys;
    } 
  }

将其用作

  <tr *ngFor="#c of content">           
   <td *ngFor="#key of c | keys">{{key}}: {{c[key]}}</td>
  </tr>

点击这里查看相关IT技术问题的解答。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接