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 । क्या आप इसे संशोधित कर सकते हैं जब तक कि यह काम करना बंद न कर दे?
जोश डेविड मिलर

2
यह एक सम्मोहन की तरह काम करता है। एकमात्र पकड़ यह है कि यह कुंजी द्वारा वर्णानुक्रम में होगा इसलिए नामकरण मायने रखता है यदि आइटम ऑर्डर प्रदर्शन के लिए प्रासंगिक है।
प्रदर्शित नाम

29
कई कारणों से, हम में से बहुत से एक में वस्तुओं पर चलने के खिलाफ सलाह देते हैं ngRepeat। वास्तव में, मैंने एक बार एक कोर टीम के सदस्य को कभी ऐसा करने की क्षमता को लागू करने के लिए खेद व्यक्त किया! आमतौर पर कंट्रोलर में ऑब्जेक्ट को अरै में बदलना बेहतर होता है; यह इरादे को स्पष्ट करता है और कुछ मामलों में अजीब / अप्रत्याशित व्यवहार के लिए जोखिम कम करता है। और आप सामान्य तरीके से हल कर सकते हैं। :-)
जोश डेविड मिलर

2
जैसा कि इसाबेलएचएम ने कहा, आउटपुट नाम से वर्णानुक्रम में आदेशित होता है। क्या ऐसा करने के लिए मजबूर करने का एक तरीका है?
न्यूमैन

4
@sethflowers जैसा कि मैंने पिछली टिप्पणी में उल्लेख किया है, मैं ऑब्जेक्ट्स में कुंजियों पर पुनरावृत्ति करने की अनुशंसा नहीं करता। बेहतर होगा कि इसे अपने कंट्रोलर में अरै में बदलें। यह मानते हुए कि आपके व्यवसाय मॉडल के आधार पर ऐसा करने के लिए मुहावरेदार तरीका नहीं है, ES6 इसे बहुत आसान बनाता है Object.getOwnPropertyNames(data).map(k => ({key:k, value:data[k]));:।
जोश डेविड मिलर

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"?
माइक हैरिसन

1
@ माइक हाइसिसन ng-repeatअनिवार्य रूप से ऑब्जेक्ट पर ध्यान केंद्रित कर रहा है और कुंजी-मूल्य जोड़े को वापस कर रहा है। ऐसा समझो for(var value in arrayOfValues) { ... }। यदि आप valueअपने लूप के अंदर वैरिएबल को फिर से असाइन करते हैं, तो आप जो अंदर है उसे नहीं बदल arrayOfValuesरहे हैं, आप सिर्फ valueएक नई वस्तु की ओर फिर से इशारा कर रहे हैं ।
जॉन सेनचीना

12

मुझे नहीं लगता कि ऐसा करने के लिए कोणीय में कोई अंतर्निहित कार्य होता है, लेकिन आप यह कर सकते हैं कि सभी हेडर नामों के साथ एक अलग गुंजाइश संपत्ति बनाकर, और आप इस संपत्ति को स्वचालित रूप से इस तरह भर सकते हैं:

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

$scope.objectHeaders = [];

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

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

1
यदि एक कोणीय नियंत्रक के अंदर डेटा के माध्यम से लूप की जरूरत है (ओपी ने एक लूप लूप के लिए पूछा है) तो आपका जवाब ठीक है।
एंटोनियो मैक्स

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;

एचटीएमएल

<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
वर्ग कोष्ठक का उपयोग नहीं करने के बारे में टिप्पणी वास्तव में सहायक थी। उस बदलाव ने मेरा कोड तय कर दिया। धन्यवाद।
माइकल खलीली

मैं भी। क्या कोई समझा सकता है कि घुंघराले कोष्ठक का उपयोग करके मेरे कोड को क्यों तय किया गया?
जा रहा है

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); 
}

एचटीएमएल:

<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>

संपादित

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.