AngularJS ng-repeat 上的 orderBy 什么都不做

AngularJS orderBy on ng-repeat does nothing

我正在为我的学生制作一个小型演示 AngularJS 应用程序,但我 运行 因 orderBy 过滤器而陷入麻烦 ng-重复。我正在从 PHP 脚本中通过 AJAX 检索 JSON 数据。数据加载正常,只是顺序不起作用。

这是 HTML 页面中我关心的部分:

<div ng-controller="MemberListController">
    <pre>Sorting predicate = {{predicate}}; reverse = {{reverse}}</pre>
    <hr/>
    <button ng-click="predicate=''">Set to unsorted</button>

    <table class="table">
        <thead>
            <tr>
                <th>
                    <button ng-click="order('gender')">Geslacht</button>
                    <span class="sortorder" ng-show="predicate === 'gender'" ng-class="{reverse:reverse}"></span>
                </th>
                <th>
                    <button ng-click="order('first_name')">Voornaam</button>
                    <span class="sortorder" ng-show="predicate === 'first_name'" ng-class="{reverse:reverse}"></span>
                </th>
                <th>
                    <button ng-click="order('last_name')">Achternaam</button>
                    <span class="sortorder" ng-show="predicate === 'last_name'" ng-class="{reverse:reverse}"></span>
                </th>
                <th>Geboren</th>
                <th>Lid sinds</th>
            </tr>
        </thead>
        <tbody>
            <tr ng-repeat="member in members track by member.id | orderBy:predicate:reverse" ng-hide="member.deleted == 1">
                <td>{{ member.gender }}</td>
                <td>{{ member.first_name }}</td>
                <td>{{ member.last_name }}</td>
                <td>{{ member.birth_date | date:'dd-MMM-yyyy' }}</td>
                <td>{{ member.member_since | date:'dd-MMM-yyyy'  }}</td>
            </tr>
        </tbody>
    </table>
</div>

这是我的 Javascript 代码:

(function () 
{
    // init the module
    var app = angular.module('ledenjs', []);

    // define the memberlist controller
    app.controller('MemberListController', ['$scope', '$http', function ($scope, $http) 
    {
        // define and set the scope properties
        $scope.members = [];
        $scope.predicate = 'last_name';
        $scope.reverse = false;

        // define the order method
        $scope.order = function (predicate) 
        {
            $scope.reverse = ($scope.predicate === predicate) ? !$scope.reverse : false;
            $scope.predicate = predicate;
        };

        // read the members from the db
        $http.get('MY_URL_HERE')
        .success(function (response) 
        {
            console.log('Received ' + response.length + ' members.');
            $scope.members = response;
        })
        .error(function () 
        {
            alert('Could not retrieve members from server.');
        });
    }]);
})();

JSON 数据是由一个非常简单的脚本从示例 table:

生成的
$result = mysqli_query($mysqli, "SELECT * FROM ledenjs");
while ($row = mysqli_fetch_assoc($result)) {
    $data[] = $row;
}
header("Content-Type: application/json");
echo json_encode($data);

返回数据的一部分:

[{"id":"10001","birth_date":"1953-09-02","first_name":"Georgi","last_name":"Facello","gender":"M","member_since":"1986-06-26","deleted":"0"},{"id":"10002","birth_date":"1964-06-02","first_name":"Bezalel","last_name":"Simmel","gender":"F","member_since":"1985-11-21","deleted":"0"},{"id":"10003","birth_date":"1959-12-03","first_name":"Parto","last_name":"Bamford","gender":"M","member_since":"1986-08-28","deleted":"0"},{"id":"10004","birth_date":"1954-05-01","first_name":"Chirstian","last_name":"Koblick","gender":"M","member_since":"1986-12-01","deleted":"0"}]

所以...我已经在 SO 上查看了有关此主题的问题,我查看了 OrderBy here 的 AngularJS 文档(如您所见,我的代码是基于那里的样本),但我的 table 仍然无法排序。

我知道 "orderBy won't work on objects, only on arrays" 回答了大部分问题,但我的数据看起来是一个数组,实际检索工作正常,我看到控制台日志行加载页面时正确的记录数。

这让我慢慢陷入困境...任何帮助将不胜感激。

马克.

已解决:感谢 Dmitriy Khudorozhkov 指出 "track by" 和 "orderBy" 往往会干扰。它确实有效,你把 "track by" 放在最后,在所有过滤器之后:

<tr ng-repeat="member in members | orderBy:predicate:reverse track by member.id"> 
<tr ng-repeat="member in members track by member.id | orderBy:predicate:reverse" ng-hide="member.deleted == 1">

- 此行在 1.2 版本之前的 AngularJS 中可能会中断;尝试删除

track by member.id

部分,看看它是否有效。

更新:Angular v.1.2 及更高版本的真正解决方案是:

ng-repeat="member in members | orderBy:predicate:reverse track by member.id"

- 跟踪 .