Директива AngularJS для заголовка таблицы
Я пытаюсь написать директиву, касающуюся изменения класса значков для заголовков таблиц. Я бы хотел (в любом случае, я считаю) стандартный способ обработки сортировки по заголовкам таблиц. В директиве будет добавлен элемент ссылки, а после пользовательского сортировки нажмите по убыванию и измените значок на desc, после щелчка снова выполните сортировку по значку и еще раз значок. Вот то, что у меня есть до сих пор, но я сейчас не в состоянии справиться с классом значков, а также сбросить другие элементы в одной таблице, но за пределами области действия. Любая помощь будет большой!
angular.directive("tableHeaders", function() {
return {
restrict: 'E',
scope: {},
template:'<i class="glyphicon glyphicon-filter"></i>',
link: function(scope, element, attrs) {
attrs.class = 'glyphicon glyphicon-sort-by-alphabet-alt';
}
}
});
Вот что у меня для стороны html:
<th>First Name<a ng-click="newOrderBy('_firstName')"><table-headers></table-headers></a></th>
<th>Last Name<a ng-click="newOrderBy('_lastName')"><table-headers></table-headers></a></th>
<tr ng-repeat="item in items | orderBy:orderBy:reverse>
<td>{{item._firstName}}</td>
<td>{{item._lastName}}</td>
</tr>
В настоящее время порядок контроллера обрабатывается в контроллере:
$scope.newOrderBy = function(order) {
$scope.orderBy = order;
$scope.reverse = !$scope.reverse;
};
Ответы
Ответ 1
Что вам нужно сделать, так это для каждого элемента, использующего вашу директиву, предоставляющую как заказ, так и текущий порядок (тот, который находится у вашего контроллера).
BTW Я думаю, что ваша директива будет лучше соответствовать атрибуту, а не тегу. Вы можете проверить следующий код:
angular.module('myApp', []).directive("sort", function() {
return {
restrict: 'A',
transclude: true,
template :
'<a ng-click="onClick()">'+
'<span ng-transclude></span>'+
'<i class="glyphicon" ng-class="{\'glyphicon-sort-by-alphabet\' : order === by && !reverse, \'glyphicon-sort-by-alphabet-alt\' : order===by && reverse}"></i>'+
'</a>',
scope: {
order: '=',
by: '=',
reverse : '='
},
link: function(scope, element, attrs) {
scope.onClick = function () {
if( scope.order === scope.by ) {
scope.reverse = !scope.reverse
} else {
scope.by = scope.order ;
scope.reverse = false;
}
}
}
}
});
И плункер, который идет с ним: http://plnkr.co/edit/P4cAm2AUGG36nejSjOpY?p=preview
Директива используется как таковая:
<thead>
<tr>
<th sort by="order" reverse="reverse" order="'name'">Name</th>
<th>Phone</th>
<th sort by="order" reverse="reverse" order="'age'">Age</th>
</tr>
</thead>
Ответ 2
Если вы не намерены писать свою собственную директиву, вы можете подумать о том, что доступно.
ngmodules.org показывает некоторые директивы, которые уже настроены для заголовков таблиц.
Вот пара вариантов с некоторым примером кода, чтобы вы почувствовали оба. Они оба выглядят развитыми и очень настраиваемыми.
![ngTable snapshot]()
angular.module('main', ['ngTable'])
.controller('DemoCtrl', function($scope, $filter, ngTableParams) {
var data = [{name: "Moroni", age: 50}, ... ]
$scope.tableParams = new ngTableParams({
page: 1, // show first page
count: 10, // count per page
sorting: {
name: 'asc' // initial sorting
}
}, {
total: data.length, // length of data
getData: function($defer, params) {
// use build-in angular filter
var orderedData = params.sorting() ?
$filter('orderBy')(data, params.orderBy()) :
data;
$defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count()));
}
});
});
![UI Grid snapshot]()
angular.module('app', ['ngAnimate', 'ui.grid'])
.controller('MainCtrl', function ($scope) {
$scope.gridOptions1 = {
enableSorting: true,
columnDefs: [
{ field: 'name' },
{ field: 'gender' },
{ field: 'company', enableSorting: false }
],
onRegisterApi: function (gridApi) {
$scope.grid1Api = gridApi;
}
};
});