2013-02-19 19 views
47

मान लीजिए मैं निम्न उपयोगकर्ताओं:AngularJS में ng-repeat में ऑब्जेक्ट डेटा स्रोत को सॉर्ट करने के लिए कैसे करें?

$scope.users = { 
    "2": { 
    email: '[email protected]', 
    name: 'John' 
    }, 
    "3": { 
    email: '[email protected]', 
    name: 'Elisa' 
    } 
} 

मैं इन विकल्पों के साथ एक <select> बनाना चाहेंगे:

<option value="3">Elisa</option> 
<option value="2">John</option> 

दूसरे शब्दों में, उन नाम के अनुसार क्रमबद्ध किया जाना चाहिए।

मैं (key, value) in expression सिंटैक्स का उपयोग निम्नलिखित कोशिश की, लेकिन यह काम नहीं करता:

<option ng-repeat="(user_id, user) in users | orderBy:'user.name'" 
     value="{{ user.id }}"> 
    {{ user.name }} 
</option> 

Live example here.

मैं क्या याद आ रही है?

कृपया ng-options के साथ समाधान का सुझाव न दें क्योंकि मैं ui-select2 का उपयोग करता हूं जो ng-options के साथ असंगत है।

+0

अपने डेटा को बदलने चाहिए हम केवल इस प्रश्न के लिए दो नए टैग और इस सवाल का जरूरत नहीं है। उपयुक्त टैग विकी जोड़कर और उन्हें अन्य प्रासंगिक प्रश्नों में जोड़कर टैग को एक पक्ष दें। यदि आपको टैग के लिए अन्य प्रश्न नहीं मिल रहे हैं, तो उन्हें दो बार अस्तित्व में रहने की आवश्यकता नहीं है ... – Charles

+2

'ng-repeat' और 'orderBy' AngularJS में बहुत आम चीजें हैं। मेरा मानना ​​है कि इन दोनों के बारे में और सवाल होंगे।लेकिन, वैसे भी, मैंने इन टैग को कुछ अन्य प्रश्नों में जोड़ा। –

+0

चूंकि मुझे औपचारिक रूप से टैग वैकल्पिक वर्तनी का सुझाव देने की प्रतिष्ठा नहीं है, इसलिए यहां किसी और को ** कोणीय-ऑर्डर-** ** जोड़ना चाहिए। ऐसा लगता है कि ऊंट 'ngRepeat'' cel cased 'ng-repeat' बन जाएगा, जबकि 'ऑर्डरबी' ऑर्डरबी बन जाएगा। – maurice

उत्तर

52

आप धागा एक कड़ी में लेखक के जवाब संदर्भ, मैंने सोचा कि यह उल्लेख किया समाधानों में से एक प्रस्तुत करने के लिए अच्छा होगा इस देखना होगा जबकि एसओ पर:

यह सच है कि यह तकनीकी रूप से कार्यान्वित नहीं किया गया है, लेकिन यदि आप अपना डेटा मॉडल थोड़ा बदलना चाहते हैं तो आसपास एक आसान काम है: ऑब्जेक्ट की गुणों की सरणी उत्पन्न करने के लिए कस्टम फ़िल्टर का उपयोग करें (बिना प्रतिस्थापन)। के लिए अपने देख आप ("आईडी" ऊपर मामले में) वस्तुओं के लिए महत्वपूर्ण क्षेत्र जोड़ते हैं तो आपको व्यवहार प्राप्त करने के लिए सक्षम होना चाहिए:

app.filter("toArray", function(){ 
    return function(obj) { 
     var result = []; 
     angular.forEach(obj, function(val, key) { 
      result.push(val); 
     }); 
     return result; 
    }; 
}); 
... 

$scope.users = { 
    1: {name: "John", email: "[email protected]", id: 1}, 
    2: {name: "Elisa", email: "[email protected]", id: 2} 
}; 

यहाँ एनजी-दोहराने के निर्देश है कि इस्तेमाल किया जा सकता है:

<option value="{{user.id}}" ng-repeat="user in users | toArray | orderBy:'name'">{{user.name}}</option> 

और यहां plunkr है।

ध्यान दें कि orderBy फ़िल्टर name को इसके पैरामीटर के रूप में लेता है और user.name नहीं है।

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

आपके उत्तर में दिए गए लिंक में, प्रस्तावित समाधान भी हैं जो फ्लाई पर उपयोगकर्ता ऑब्जेक्ट्स में id संपत्ति बनाते हैं, लेकिन मुझे लगता है कि यह दृष्टिकोण थोड़ा कम गन्दा है (डेटा प्रतिकृति शुरू करने की लागत पर)।

+0

@ बार्थज़ेलवेस्की यह अच्छा लग रहा है, हालांकि अगर मैं फिल्टर को रिवर्स करने की कोशिश करता हूं तो कुछ भी नहीं आता है? क्या आप एक स्थिति के रूप में रिवर्स i n cuh संभाल सकते हैं? ng-repeat = "उपयोगकर्ता में उपयोगकर्ता | toArray | orderBy: 'name': रिवर्स" – ak85

+0

यह उपयोगकर्ताओं में भी (कुंजी, मान) का उपयोग करते समय भी काम करता है। बहुत बढ़िया! –

+1

@ ak85 के प्रश्न के जवाब में आप ng-repeat = "उपयोगकर्ताओं में उपयोगकर्ता | toArray | orderBy: 'name': true" सूची को उल्टा करने के लिए उपयोग करेंगे। बूलियन सच एक रिवर्स ऑर्डर की पहचान करता है। – Doug

9

ठीक है, मैं इस सवाल का जवाब मिला:

It is not implemented yet :(

+9

यह उल्लेखनीय भी हो सकता है कि आपके द्वारा उद्धृत धागे के अनुसार इसे लागू करने की कोई योजना नहीं है। – mhess

0

स्वीकार किए जाते हैं जवाब देने के लिए जोड़ा जा रहा है और अपने डेटा स्वरूप को देखने के लिए, आप के रूप में

app.filter('myFilterUsers',function(){ 
    return function(data) 
    { 
     var newRes = []; 
     angular.forEach(data,function(val,key){ 
      val["id"] = key; //Add the ID in the JSON object as you need this as well. 
      newRes.push(val); 
     }); 
     return newRes; 
    } 
}); 
संबंधित मुद्दे

 संबंधित मुद्दे