AngularJS自定义排序指令

时间:2014-07-13 16:14:31

标签: javascript angularjs sorting

我正在尝试通过创建一个AngularJS指令来清理我的一些HTML代码,以便对表中的列进行排序。当我单击标题时,没有记录任何错误,但没有任何反应,列不会重新排序。

指令

Glenn.directive('sort', function() {
    return {
        restrict: 'A',
        link: function(scope, element, attrs) {
            scope.predicate = 'title';
            scope.reverseSort = false;

            element.on('click', function() {
                scope.predicate = attrs.sort;
                scope.reverseSort != scope.reverseSort;
            });
        }
    }
});

HTML

<th>
    <a sort="title" href="">Title
        <span ng-show="predicate == 'title'">
            <span ng-show="!reverseSort"><i class="fa fa-caret-up"></i></span>
            <span ng-show="reverseSort"><i class="fa fa-caret-down"></i></span>
        </span>
    </a>
</th>

我在哪里错了?我是否需要使用$ apply之类的东西来使分类更改出现在dom中?

2 个答案:

答案 0 :(得分:2)

让指令工作,只需要将scope.$apply();添加到最后。

Glenn.directive('sort', function() {
    return {
        restrict: 'A',
        link: function(scope, element, attrs) {
            scope.predicate = 'title';
            scope.reverseSort = false;

            element.on('click', function() {
                scope.predicate = attrs.sort;
                scope.reverseSort != scope.reverseSort;
                scope.$apply();
            });
        }
    }
});

答案 1 :(得分:1)

我可以建议通过过滤器而不是指令添加排序 将以下代码添加到filters.js:

.filter('orderObjectBy', [function() {
return function(items, field, reverse) {
    var filtered = [];
    angular.forEach(items, function(item) {
        filtered.push(item);
    });
    filtered.sort(function (field_a, field_b) {
        var result =  (parseFloat(field_a) - parseFloat(field_b));
        if (isNaN(result)) {
            if (field_a > field_b)
            {
                return 1;
            }
            else if (field_a < field_b)
            {
                return -1;
            }
            else
            {
                return 0;
            }
        }
        return result;


    });
    if(reverse) filtered.reverse();
    return filtered;
};
}]);

on html:

<div id="table-title-publisher" data-ng-click="orderByField='name'; reverseSort = !reverseSort;"></div>

在你的转发器上(如果它是一张桌子使用tr otherweiser li作为列表)请添加: