次のユーザーがいるとします。
$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>
私は何が欠けていますか?
ng-options
と互換性のない ui-select2
を使用しているため、ng-options
を使用したソリューションを提案しないでください。
リンクの著者の回答を参照するスレッドでこれを見るでしょうが、私は言及された回避策の1つをSOに置くのが良いと思いました:
これは技術的に実装されていないことは確かですが、データモデルを少し変更する場合は簡単な回避策があります。カスタムフィルターを使用してオブジェクトのプロパティの配列を生成します(withoutreplacement)。キーフィールドをオブジェクト(上記の場合は「id」)に追加すると、探している動作を取得できるはずです。
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}
};
使用できるng-repeatディレクティブは次のとおりです。
<option value="{{user.id}}" ng-repeat="user in users | toArray | orderBy:'name'">{{user.name}}</option>
そして、これが plunkr です。
orderBy
フィルターは、user.name
ではなく、name
をパラメーターとして使用することに注意してください。
残念ながら、オブジェクトにid
プロパティを追加すると、それを含むオブジェクトのキーと一致しない可能性があります。
あなたの答えで言及したリンクには、ユーザーオブジェクトにid
プロパティをオンザフライで作成する提案されたソリューションもありますが、このアプローチは少し面倒ではないようです(データを導入するコストがかかります)レプリケーション)。
OK、答えが見つかりました:
受け入れられた回答に追加してデータ形式を確認するには、データを次のように変換する必要があります
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;
}
});