私は最初のプロジェクト(トーナメントマネージャー)でAngularJSを使用しようとしていますが、ng-repeat
のorderBy
フィルターは機能しません:(すべての それに関するドキュメント =、しかし何もしない:/
だから、私はそのような$scope
で定義された変数を持っています:
$scope.order_item = "count_win";
$scope.order_reverse = false;
$scope.teams = {
100 : {
id: 100,
name: "XXX",
count_win: 1,
count_loose: 2,
goal_average: 1,
},
200 : {
id: 200,
name: "XXX",
count_win: 1,
count_loose: 2,
goal_average: 1,
},
[...]
};
今、私の見解では、(最初に1つの注文項目のみで)再注文しようとしていますが、機能しません...
<tr ng-repeat="team in teams | orderBy:order_item:order_reverse">
<td>{{team.name}}</td>
<td>{{team.count_loose}}</td>
<td>{{team.goal_average}}</td>
</tr>
2回目は、2つの情報から並べ替えます。最初のcount_win
とgoal_average
が等しい場合。$scope.order_item
をそのように置き換えますが、1つの場合はコードが動作しない、彼は2で動作することは決してないだろう...
$scope.order_item = ['count_win','goal_average'];
読んでくれてありがとう、そして投稿サイズでごめんね。
$scope.teams
は配列ではなく(オブジェクトのオブジェクトです)、orderBy
フィルターは配列でのみ機能します。 $scope.teams
を配列にすると、動作します:
$scope.teams = [
{
id: 100,
name: "team1",
count_win: 3,
count_loose: 2,
goal_average: 2,
},
{
id: 200,
name: "team2",
count_win: 3,
count_loose: 2,
goal_average: 1,
},
{
id: 300,
name: "team3",
count_win: 1,
count_loose: 2,
goal_average: 1,
}
];
または、次のように、オブジェクトで機能する特別なフィルターを追加できます( here から借用):
app.filter('orderObjectBy', function() {
return function(items, field, reverse) {
var filtered = [];
angular.forEach(items, function(item) {
filtered.Push(item);
});
filtered.sort(function (a, b) {
return (a[field] > b[field] ? 1 : -1);
});
if(reverse) filtered.reverse();
return filtered;
};
});
そして、次のように使用します:
<tr ng-repeat="team in teams | orderObjectBy:order_item:order_reverse">
このカスタムフィルタは、質問の2番目の部分のように、並べ替え順序の配列では機能しないことに注意してください。
OrderByのスコープパラメーターを作成する必要はありません。配列を扱う場合は、マークアップで直接これを行うことができます。
<tr ng-repeat="team in teams | orderBy:count_win:false">
2つのパラメータを使用すると、ちょうどする必要があります
<tr ng-repeat="team in teams | orderBy:['count_win','goal_average']">
より複雑な順序の場合、次のようにスコープ内で関数を作成できます。
$scope.customOrder = function (team) {
//custom
}
そして、それを次のように呼ぶだけです
<tr ng-repeat="team in teams | orderBy:customOrder">
@Jerradが言ったように、ng-repeat
は配列でのみ動作するため、チームオブジェクトを配列に変換して適切に動作させる必要があります。
ng-repeatは配列でのみ機能し、JSONオブジェクトでは機能しません。これについてはすでにここで説明しました: Angular-ng-repeat orderBy work を作成できません
JSONオブジェクトを配列に変更するか、その場で変換する必要があります。コントローラは次のようになります。
var app = angular.module('app', []);
app.controller('Ctrl', function ($scope) {
$scope.teams = [
{
id: 100,
name: "A Team",
count_win: 1,
count_loose: 2,
goal_average: 1
},
{
id: 200,
name: "C Team",
count_win: 2,
count_loose: 3,
goal_average: 4
},
{
id: 300,
name: "B Team",
count_win: 4,
count_loose: 1,
goal_average: 8
}
];
$scope.predicate = 'name';
});
あなたのデータを含むデモでフィドルを作成しました: