Angenommen, ich habe folgende Benutzer:
$scope.users = {
"2": {
email: '[email protected]',
name: 'John'
},
"3": {
email: '[email protected]',
name: 'Elisa'
}
}
Ich möchte einen <select>
mit den folgenden Optionen erstellen:
<option value="3">Elisa</option>
<option value="2">John</option>
Mit anderen Worten, Benutzer sollten nach Namen sortiert werden.
Ich habe Folgendes mit der Syntax (key, value) in expression
versucht, aber es funktioniert nicht:
<option ng-repeat="(user_id, user) in users | orderBy:'user.name'"
value="{{ user.id }}">
{{ user.name }}
</option>
Was vermisse ich?
Bitte schlagen Sie keine Lösungen mit ng-options
vor, da ich ui-select2
verwende, das mit ng-options
nicht kompatibel ist.
Während Sie dies in dem Thread sehen, auf den die Antwort der Autorin in einem Link verweist, dachte ich, es wäre gut, wenn Sie eine der oben genannten Problemumgehungen für SO veröffentlichen:
Es ist richtig, dass dies technisch nicht implementiert ist, aber es ist eine einfache Lösung, wenn Sie Ihr Datenmodell leicht ändern möchten: Verwenden Sie einen benutzerdefinierten Filter, um ein Array der Eigenschaften des Objekts zu generieren (ohne - Ersetzung). Wenn Sie das Schlüsselfeld zu den Objekten hinzufügen ("id" im obigen Fall), sollten Sie das gewünschte Verhalten erhalten können:
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}
};
Hier ist die ng-repeat-Direktive, die verwendet werden könnte:
<option value="{{user.id}}" ng-repeat="user in users | toArray | orderBy:'name'">{{user.name}}</option>
Und hier ist der plunkr .
Beachten Sie, dass der orderBy
-Filter name
als Parameter und nicht user.name
verwendet.
Leider führt das Hinzufügen der id
-Eigenschaft zu Ihren Objekten zu einem Konflikt mit dem Schlüssel im übergeordneten Objekt.
In dem Link, den Sie in Ihrer Antwort erwähnt haben, gibt es auch Lösungsvorschläge, die die id
-Eigenschaft in den Benutzerobjekten im laufenden Betrieb erstellen, aber ich denke, dass dieser Ansatz etwas weniger chaotisch ist (was die Einführung der Datenreplikation kostet).
OK, ich habe die Antwort gefunden:
Wenn Sie die akzeptierte Antwort hinzufügen und Ihr Datenformat sehen, sollten Sie Ihre Daten als konvertieren
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;
}
});