【发布时间】:2014-04-02 05:59:26
【问题描述】:
我的团队成员编写了以下分页指令:
myApp.directive('pagination', function($timeout) {
return {
restrict: 'A',
controller: function($scope, $element, $attrs, $rootScope) {
var halfDisplayed = 1.5,
displayedPages = 3,
edges = 2;
$scope.getInterval = function() {
return {
start: Math.ceil($scope.currentPage > halfDisplayed ? Math.max(Math.min($scope.currentPage - halfDisplayed, ($scope.pages - displayedPages)), 0) : 0),
end: Math.ceil($scope.currentPage > halfDisplayed ? Math.min($scope.currentPage + halfDisplayed, $scope.pages) : Math.min(displayedPages, $scope.pages))
};
};
$scope.selectPage = function(pageIndex) {
$scope.currentPage = pageIndex;
$scope.$apply();
$scope.draw();
$scope.paginationUpdate();
};
$scope.appendItem = function(pageIndex, opts) {
var options, link;
pageIndex = pageIndex < 0 ? 0 : (pageIndex < $scope.pages ? pageIndex : $scope.pages - 1);
options = $.extend({
text: pageIndex + 1,
classes: ''
}, opts || {});
if (pageIndex === $scope.currentPage) {
link = $('<span class="current">' + (options.text) + '</span>');
} else {
link = $('<a href="javascript:void(0)" class="page-link">' + (options.text) + '</a>');
link.bind('click', function() {
$scope.selectPage(pageIndex);
});
}
if (options.classes) {
link.addClass(options.classes);
}
$element.append(link);
};
$rootScope.draw = function() {
$($element).empty();
var interval = $scope.getInterval(),
i;
// Generate Prev link
if (true) {
$scope.appendItem($scope.currentPage - 1, {
text: 'Prev',
classes: 'prev'
});
}
// Generate start edges
if (interval.start > 0 && edges > 0) {
var end = Math.min(edges, interval.start);
for (i = 0; i < end; i++) {
$scope.appendItem(i);
}
if (edges < interval.start) {
$element.append('<span class="ellipse">...</span>');
}
}
// Generate interval links
for (i = interval.start; i < interval.end; i++) {
$scope.appendItem(i);
}
// Generate end edges
if (interval.end < $scope.pages && edges > 0) {
if ($scope.pages - edges > interval.end) {
$element.append('<span class="ellipse">...</span>');
}
var begin = Math.max($scope.pages - edges, interval.end);
for (i = begin; i < $scope.pages; i++) {
$scope.appendItem(i);
}
}
// Generate Next link
if (true) {
$scope.appendItem($scope.currentPage + 1, {
text: 'Next',
classes: 'next'
});
}
};
},
link: function(scope, element, attrs, controller) {
$timeout(function() {
scope.draw();
}, 2000);
scope.$watch(scope.paginatePages, function() {
scope.draw();
});
},
template: '<div class="pagination-holder dark-theme">' + '</div>',
replace: true
};
});
不幸的是,当他写的时候,指令引用了控制器变量和函数:
function PatientListModalConfigCtrl($scope, $rootScope, myService) {
$scope.currentPage = 0;
$scope.paginationUpdate = function() {
var list = myService.search($scope.currentPage + 1);
list.then(function(data) {
$rootScope.List = data[1];
$rootScope.pages = data[0];
});
};
};
我能够使用 attr 参数将函数调用替换为 $scope[]();,但只要我尝试添加:
scope: {
currentPage: '=',
totalPages: '='
}
进入指令并将指令与控制器隔离,分页完全停止显示。我也可以对这两个变量使用 attr 参数吗?我更喜欢在指令中使用范围,因为变量会发生变化,但我的尝试失败了。如有任何反馈,我将不胜感激。
【问题讨论】:
-
您是否调整了 HTML 中的指令以将值也传递给作用域?
-
是的,我在指令中声明的范围内使用了以下内容,但仍然失败。
<div pagination="paginationUpdate();" current-page="currentPage" total-pages="pages" style="float: right;"></div>
标签: angularjs pagination angularjs-directive