AngularJS में ng-repeat में ऑब्जेक्ट डेटा स्रोत को कैसे सॉर्ट करें?




angularjs-ng-repeat angularjs-orderby (3)

ठीक है, मुझे जवाब मिला:

इसे अभी तक लागू नहीं किया गया है :(

मान लीजिए मेरे पास निम्नलिखित उपयोगकर्ता हैं:

$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 सिंटैक्स (key, value) in expression का उपयोग करके निम्नलिखित की कोशिश की, लेकिन यह काम नहीं करता है:

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

इसका जीता जागता उदाहरण है।

मैं क्या खो रहा हूँ?

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


स्वीकृत उत्तर को जोड़ना और अपना डेटा प्रारूप देखना, आपको अपना डेटा रूपांतरित करना चाहिए

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

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

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

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 संपत्ति बनाते हैं, लेकिन मुझे लगता है कि यह दृष्टिकोण थोड़ा कम गड़बड़ है (डेटा प्रतिकृति शुरू करने की लागत पर)।





angularjs-orderby