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이 말했듯이 출력은 이름순으로 알파벳순으로 정렬됩니다. 그렇게하지 않도록 강제 할 수있는 방법이 있습니까?
newman

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
감사합니다! 호기심에서이 기술을 문서에서 찾은 적이 있습니까? 나는 당신의 대답을 찾을 때까지 헛된 것을 찾았습니다.
Roger

@cbk : 이것은 내가 찾던 것입니다. 감사합니다
JKA

대단히 감사합니다, 당신은 내 하루를 구했습니다 :)
Sergey

4
@cbk는 이것을 사용하는 것과 동일하지 ng-model="value"않습니까?
마이크 해리슨

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는보기 루프를 요청했습니다).
Antonio Max

5

키-값이 알파벳 순서로 표시되지 않도록 아래 절차를 따를 수 있습니다.

자바 스크립트

$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

다음과 같이 객체를 반복 하는 할 일 목록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

나도. 누군가 중괄호를 사용하여 코드를 수정 한 이유를 설명 할 수 있습니까?
beingalex

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

자바 스크립트 (컨트롤러) 또는 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로 가져올 수 있습니다 ...

또한 Object 키를 보는 것은 나쁜 생각이 아니며 필요한 경우 키 배열을 제공합니다. 자세한 내용은 여기를 참조하십시오.

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.