Я добавляю разбивку на страницы в одном из своих представлений, и хочу, чтобы текущая страница загружала class="active"
загрузки class="active"
. Поскольку существует только один файл HTML, и текущая страница передается через $routeParams
и количество страниц может меняться, мне нужно создать разбиение на страницы с помощью ng-repeat
и добавить после этого активный класс. Я сделал директиву, которая должна это сделать после создания правильного <li>
, но он этого не делает. Я не знаю, все еще проблема с хронологическим порядком разрешаемых выражений или если мне нужно поместить элемент DOM по-другому из директивы.
Код:
<ul class="pagination pagination-sm">
<li ng-repeat="p in pages()" id="{{p}}" mark-active-page page="{{currentpage}}" repeat="{{p}}"><a href="">{{p}}</a></li>
</ul>
Функция и переменные контроллера:
$scope.currentpage = 1;
$scope.pagecount = 4; //total pages
$scope.pages = function() {
var input = [];
for (var i = 1; i <= $scope.pagecount; i++) {
input.push(i);
}
return input;
};
Директива (позже может стать более чистой. Atm мой фокус находится на jQuery):
app.directive('markActivePage', function($parse) {
return {
restrict: 'A',
scope: {
page: '@',
repeat: '@',
},
link: function(scope, elem, attrs) {
attrs.$observe('repeat', function(r){
attrs.$observe('page', function(p){
if(r==p) {
var id = '#' + p;
//I get the right id here without a problem, but the jQuery doesn't work
angular.element(id).addClass('active');
}
});
});
}
};
});
Вы можете сделать это проще, используя встроенные угловые директивы, такие как ng-class и ng-click. Смотри ниже:
<li ng-click="setCurrentPage(p)" ng-class="{active: currentpage === {{p}}}" ng-repeat="p in pages()" id="{{p}}"><a href="">{{p}}</a></li>
Затем вы можете удалить markActivePage и поместить ниже в свой контроллер.
$scope.setCurrentPage = function(p) {
$scope.currentpage = p;
}
Надеюсь это поможет