2017-01-12 1 views
0

J'ai un objet qui ressemble à:angulaire ng-options, objet sorte

{ 
    3019: 'Javascript', 
    3046: 'Css' 
} 

puis, je montre cet objet dans un select comme:

<select 
    ng-model="langChoosed" 
    ng-options="key as value for (key, value) in progLanguages" 
></select> 

je dois trier les articles à l'intérieur du filtre select mais orderBy, semble fonctionner uniquement sur les tableaux, comment puis-je le faire fonctionner avec des objets?

+1

Les clés d'objet sont ** non ordonnées * - donc non, vous ne pouvez pas. – tymeJV

Répondre

1

NO afin de ne pas peut être appliquée à un objet ordinaire, vous pouvez également définir une méthode dans le contrôleur pour convertir l'objet à un tableau

DEMO

var app = angular.module('todoApp', []); 
 

 
app.controller("dobController", ["$scope", 
 
    function($scope) { 
 
    $scope.progLanguages = { 
 
     3019: 'Javascript', 
 
     3046: 'Css' 
 
    }; 
 
    $scope.templatesAry = function() { 
 
     var ary = []; 
 
     angular.forEach($scope.progLanguages, function(val, key) { 
 
     ary.push({ 
 
      id: key, 
 
      lang: val 
 
     }); 
 
     }); 
 
     return ary; 
 
    }; 
 
    } 
 

 
]);
<!DOCTYPE html> 
 
<html ng-app="todoApp"> 
 

 
<head> 
 
    <title>To Do List</title> 
 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.7/angular.min.js"></script> 
 

 
</head> 
 

 

 
<body ng-controller="dobController"> 
 
    <select class="form-control" id="selection" ng-model="currentSelected" ng-options="selection.id as selection.lang for selection in templatesAry() | orderBy:'lang'"></select> 
 
</body> 
 

 
</html>

1

Les clés d'objet ne sont pas ordonnées - vous ne pouvez donc pas les trier. Convertissez votre objet à un tableau, les trier, utilisez-le:

var sortedArrayFromObject = Object.keys($scope.progLanguages).map(function(key) { 
    var obj = {}; 
    obj["key"] = key; 
    obj["value"] = $scope.propLanguages[key]; 

    return obj; 
}); 

//Sort it 
sortedArrayFromObject.sort(function(a, b) { 
    return +a.key - +b.key; //since all keys are strings - do an int cast with "+" 
}); 

//Assign it 
$scope.sortedArray = sortedArrayFromObject; 

utiliser:

<select 
ng-model="langChoosed" 
ng-options="item.key as item.value for item in sortedArray"></select> 
+0

n'est pas nécessaire pour créer un autre tableau avec la carte. Merci pour la réponse, je voudrais utiliser forEach au lieu de la carte – Pablo

-1

est quelque chose comme ça ok pour vous?

var myObj = { 
     3046:'Css', 
    3019:'Javascript' 
    }; 
    var keys = []; 

angular.forEach(myObj, function(value,key){ 
    keys.push(key); 
}); 

keys.sort(); 

$scope.myObj2={}; 
angular.forEach(keys, function(key){ 
    $scope.myObj2[key]=myObj[key]; 
}); 

et votre code html

<select 
    ng-model="langChoosed" 
    ng-options="key as value for (key, value) in myObj2" 
></select> 
+0

obj2 encore un objet. Il ne sera pas trié – Pablo

+1

Oui, vous avez raison. myObj2 doit être un tableau où vous devez pousser votre structure '$ scope.myObj2 = []; angular.forEach (touches, fonction (touche) { $ scope.myObj2.push ('id': touche, 'valeur': myObj [touche]); }); ' – Francesca