AngularJSのng-repeatでキーと値を反復する方法は?


679

私のコントローラーには、次のようなデータがあります。 $scope.object = data

これで、このデータはのキーと値を含む辞書になりますjson

object.nameテンプレートで属性にアクセスできます。同様にキーを反復してテーブルに表示する方法はありますか?

<tr><td> {{key}} </td> <td> data.key </td>

データはこんな感じ

{
    "id": 2,
    "project": "wewe2012",
    "date": "2013-02-26",
    "description": "ewew",
    "eet_no": "ewew",
}

回答:


1407

どうですか:

<table>
  <tr ng-repeat="(key, value) in data">
    <td> {{key}} </td> <td> {{ value }} </td>
  </tr>
</table>

このメソッドはドキュメントにリストされていますhttps : //docs.angularjs.org/api/ng/directive/ngRepeat


1
正常に動作するはずです:plnkr.co/edit/7AQF6k7hf2aZbWFmhVoX?p=​​preview。それが機能しなくなるまで変更できますか?
Josh David Miller

2
それは魅力のように働きます。唯一の難点は、キーによってアルファベット順に並べられることです。そのため、アイテムの順序がディスプレイに関連している場合は、命名が重要になります。
表示名

29
@IsabelHM多くの理由で、多くの人がのオブジェクトを反復しないことを推奨していますngRepeat。実際、コアチームメンバーがこれを実現する機能を実装したことを後悔していることを聞いたことがあります。通常は、コントローラーのオブジェクトを配列に変換する方が適切です。これにより、意図がより明確になり、特定の状況での奇妙な/予測できない動作のリスクが減少します。そして、通常の方法で並べ替えることができます。:-)
Josh David Miller

2
IsabelHMが言ったように、出力は名前のアルファベット順に並べられます。そうしないように強制する方法はありますか?
ニューマン2014

4
@sethflowers前のコメントで述べたように、オブジェクトのキーを反復することはお勧めしません。それをコントローラーの配列に変換することをお勧めします。ビジネスモデルに基づいてこれを行う慣用的な方法がないと仮定すると、ES6はそれを非常に簡単にしますObject.getOwnPropertyNames(data).map(k => ({key:k, value:data[k]));
Josh David Miller

132

双方向バインディングでプロパティ値を編集する場合:

<tr ng-repeat="(key, value) in data">
    <td>{{key}}<input type="text" ng-model="data[key]"></td>
</tr>

2
ありがとうございました!好奇心から、このテクニックをドキュメントのどこかに見つけましたか?ここであなたの答えが見つかるまで無駄に検索しました。
ロジャー

@cbk:これは私が探していたものです..ありがとう
JKA

どうもありがとう、あなたは私の日を救った:)
セルゲイ

4
@cbkはこれを使用するのと同じではありませんng-model="value"か?
Mike Harrison

1
@MikeHarrison ng-repeatは基本的にオブジェクトを反復処理し、キーと値のペアを返します。のように考えてくださいfor(var value in arrayOfValues) { ... }valueループ内で変数を再割り当てしても、の内部を変更するのではなくarrayOfValues、単にvalue新しいオブジェクトを指し示すだけです。
Jon Senchyna

12

これを行うための角度に組み込み関数はないと思いますが、すべてのヘッダー名を含む個別のスコーププロパティを作成することでこれを行うことができ、このプロパティを次のように自動的に入力できます。

var data = {
  foo: 'a',
  bar: 'b'
};

$scope.objectHeaders = [];

for ( property in data ) {
  $scope.objectHeaders.push(property); 
}

// Output: [ 'foo', 'bar' ]

1
角度コントローラ内のデータをループ処理する必要がある場合、答えはうまく機能します(OPはビューループを要求しました)。
アントニオマックス

5

以下の手順に従って、Key-Valueがアルファベット順に表示されないようにすることができます。

Javascript

$scope.data = {
   "id": 2,
   "project": "wewe2012",
   "date": "2013-02-26",
   "description": "ewew",
   "eet_no": "ewew",
};
var array = [];
for(var key in $scope.data){
    var test = {};
    test[key]=$scope.data[key];
    array.push(test);
}
$scope.data = array;

HTML

<p ng-repeat="obj in data">
   <font ng-repeat="(key, value) in obj">
      {{key}} : {{value}}
   </font>
</p>

重複しないキーワードの重複
amanuel2

4

オブジェクトをループするtodoリストのng-repeat

var app = angular.module('toDolistApp', []);
app.controller('toDoListCntrl', function() {
  var self = this;
  self.toDoListItems = {};// []; //dont use square brackets if keys are string rather than numbers.
  self.doListCounter = 0;

  self.addToDoList = function() {		  		   
    var newToDoItem = {};
    newToDoItem.title     = self.toDoEntry;
    newToDoItem.completed = false;		   

    var keyIs = "key_" + self.doListCounter++;  		   

    self.toDoListItems[keyIs] = newToDoItem;		   
    self.toDoEntry = ""; //after adding the item make the input box blank.
  };
});

app.filter('propsCounter', function() {
  return function(input) {
    return Object.keys(input).length;
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<body ng-app="toDolistApp">    
  <div ng-controller="toDoListCntrl as toDoListCntrlAs">
    Total Items: {{toDoListCntrlAs.toDoListItems | propsCounter}}<br />
    Enter todo Item:  <input type="text" ng-model="toDoListCntrlAs.toDoEntry"/>
    <span>{{toDoListCntrlAs.toDoEntry}}</span>
    <button ng-click="toDoListCntrlAs.addToDoList()">Add Item</button> <br/>
    <div ng-repeat="(key, prop) in toDoListCntrlAs.toDoListItems"> 
      <span>{{$index+1}} : {{key}}   : Title = {{ prop.title}} : Status = {{ prop.completed}} </span>
    </div>     
  </div>    
</body>


1
角括弧を使用しないことについてのコメントは本当に役に立ちました。この変更によりコードが修正されました。ありがとう。
Michael Khalili

私も。中括弧を使用してコードを修正した理由を誰かが説明できますか?
arealex 2018年

1

ここに完全な例:-

<!DOCTYPE html >
<html ng-app="dashboard">
<head>
<title>AngularJS</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<link rel="stylesheet" href="./bootstrap.min.css">
<script src="./bootstrap.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.4/angular.min.js"></script>
</head>
<body ng-controller="myController">
    <table border='1'>
        <tr ng-repeat="(key,val) in collValues">
            <td ng-if="!hasChildren(val)">{{key}}</td>  
            <td ng-if="val === 'string'">
                <input type="text" name="{{key}}"></input>
            </td>
            <td ng-if="val === 'number'">
                <input type="number" name="{{key}}"></input>
            </td>
            <td ng-if="hasChildren(val)" td colspan='2'>
                <table border='1' ng-repeat="arrVal in val">
                    <tr ng-repeat="(key,val) in arrVal">
                        <td>{{key}}</td>    
                        <td ng-if="val === 'string'">
                            <input type="text" name="{{key}}"></input>
                        </td>
                        <td ng-if="val === 'number'">
                            <input type="number" name="{{key}}"></input>
                        </td>
                    </tr>
                </table>                
            </td>

        </tr>       
    </table>
</body>

<script type="text/javascript">

    var app = angular.module("dashboard",[]);
    app.controller("myController",function($scope){
        $scope.collValues = {
            'name':'string',
            'id':'string',
            'phone':'number',
            'depart':[
                    {
                        'depart':'string',
                        'name':'string' 
                    }
            ]   
        };

        $scope.hasChildren = function(bigL1) {
            return angular.isArray(bigL1);
} 
    });
</script>
</html>


0

あなたはあなたのjavascript(コントローラー)またはあなたのhtml(角度ビュー)でそれをすることができます...

js:

$scope.arr = [];
for ( p in data ) {
  $scope.arr.push(p); 
}

html:

<tr ng-repeat="(k, v) in data">
    <td>{{k}}<input type="text" ng-model="data[k]"></td>
</tr>

私はhtmlの方がより角張っていると思いますが、コントローラで行うこともでき、htmlでそれを取得できます...

また、オブジェクトキーを見るのも悪くありません。必要に応じて、キーの配列を提供します。詳細はこちら:

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys


-2

これが実際の例です:

<div class="item item-text-wrap" ng-repeat="(key,value) in form_list">
  <b>{{key}}</b> : {{value}}
</div>

編集済み

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.