จะวนซ้ำคีย์และค่าด้วย ng-repeat ใน AngularJS ได้อย่างไร


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 สำหรับหลายเหตุผลมากของเราแนะนำต่อ iterating ngRepeatมากกว่าวัตถุใน ในความเป็นจริงฉันเคยได้ยินสมาชิกในทีมแกนเสียใจที่เคยใช้ความสามารถในการทำเช่นนั้น! โดยปกติแล้วการแปลงวัตถุในคอนโทรลเลอร์ให้เป็นอาร์เรย์นั้นดีกว่า สิ่งนี้ทำให้เจตนาชัดเจนและลดความเสี่ยงสำหรับพฤติกรรมที่แปลก / คาดเดาไม่ได้ในบางกรณี และคุณสามารถเรียงลำดับในแบบปกติ :-)
Josh David Miller

2
ตามที่ IsabelHM กล่าวว่าเอาต์พุตจะเรียงลำดับตามตัวอักษรตามชื่อ มีวิธีบังคับไม่ให้ทำเช่นนั้นหรือไม่?
นิวแมน

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"หรือ?
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 ถามถึงการวนรอบมุมมอง)
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

รายการสิ่งที่ต้องทำเช่น loops ซึ่งเหนือวัตถุโดย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

คุณสามารถทำได้ใน 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 ของคุณ ...

ไม่ใช่ความคิดที่ไม่ดีเลยที่จะดูที่ปุ่ม 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.