如何在Angular UI Bootstrap Pagination中生成链接

时间:2013-05-29 07:39:47

标签: javascript angularjs

我一直在继续学习角度,现在已成功使用角度ui bootstrap分页。我能够显示项目列表以及正确的页数。每当我点击分页时,也会切换到正确的页面。

现在我的问题是,如果用户想要为某个页面添加书签,或者为了确保用户在刷新浏览器时保持在同一页面上,我该如何处理它。浏览器的地址栏上没有生成链接(href)。我还需要设置路线吗?请你发一些例子,因为它会对我有很大的帮助。谢谢。

5 个答案:

答案 0 :(得分:12)

您需要设置路线,可以使用routeProviderui router

进行设置

在这个例子中,我使用路由提供程序来演示,但想法是一样的。

在这里,我设置了一个currentPage作为参数的路线:

app.config(function($routeProvider) {
  $routeProvider
    .when('/page/:currentPage', {
        templateUrl: "template.html",
        controller: PaginationDemoCtrl
    })
});

在您的控制器中,您可以从$routeParam

中检索当前页面
$scope.currentPage = $routeParams.currentPage || 1; //default to 1 if the parameter is missing
//load your paged data from server here.

您可以$watch当前页面进行更改并相应地更新位置:

$scope.$watch("currentPage",function(value){
     if (value){
        $location.path("/page/" + value);
     }
  })

Source code

DEMO link

使用路由,您还需要更新代码以从服务器加载分页数据。 currentPage更改时,我们不会立即加载数据(在本例中为$ watch函数)。我们在检索$routeParam.currentPage参数时加载了分页数据。

根据@Harry的要求,这是通过覆盖bootstrap html模板生成href链接的另一种解决方案:

app.config(function($routeProvider) {
  $routeProvider
    .when('/page/:currentPage?', {
        templateUrl: "template.html",
        controller: PaginationDemoCtrl
    })
})
.run(["$templateCache","$rootScope","$location", function($templateCache,$rootScope,$location) {

  $rootScope.createPagingLink = function(pageNumber){
    return "#" + $location.path().replace(/([0-9])+/,pageNumber);
//Here is a sample function to build href paths. In your real app, you may need to improve this to deal with more case.
  }

  $templateCache.put("template/pagination/pagination.html",
    "<ul class=\"pagination\">\n" +
    "  <li ng-if=\"boundaryLinks\" ng-class=\"{disabled: noPrevious()}\"><a ng-href=\"{{$root.createPagingLink(1)}}\">{{getText('first')}}</a></li>\n" +
    "  <li ng-if=\"directionLinks\" ng-class=\"{disabled: noPrevious()}\"><a ng-href=\"{{$root.createPagingLink(page - 1)}}\">{{getText('previous')}}</a></li>\n" +
    "  <li ng-repeat=\"page in pages track by $index\" ng-class=\"{active: page.active}\"><a ng-href=\"{{$root.createPagingLink(page.number)}}\">{{page.text}}</a></li>\n" +
    "  <li ng-if=\"directionLinks\" ng-class=\"{disabled: noNext()}\"><a ng-href=\"{{$root.createPagingLink(page + 1)}}\">{{getText('next')}}</a></li>\n" +
    "  <li ng-if=\"boundaryLinks\" ng-class=\"{disabled: noNext()}\"><a ng-href=\"{{$root.createPagingLink(totalPages)}}\">{{getText('last')}}</a></li>\n" +
    "</ul>");
}]);

Source code

DEMO link

答案 1 :(得分:1)

我们可以使用$ location执行此操作,而无需$ route。

以下是如何从Angular UI Bootstrap中调用分页的示例:

<pagination ng-model="Controls.currentPage"
            total-items="Controls.totalItems"
            items-per-page="Controls.videosPerPage"
            max-size="5"
            rotate="false"
            boundary-links="true"
            ng-change="pageChanged()">
</pagination>

在pageChanged()函数中,使用以下命令为结果页面创建唯一的URL:

**我的代码是在Coffeescript上,但逻辑很简单,代码很容易适应**

$location.search('page', $scope.Controls.currentPage)

在您的控制器上,使用以下内容检查启动时是否存在URL参数:

urlParams = $location.search()
if urlParams.page?
  $scope.Controls.currentPage = urlParams.page
else
  $scope.Controls.currentPage = 1

答案 2 :(得分:0)

是的,如果您希望您的应用允许链接到某些状态,那么您必须让您的应用利用routeProvider。

官方文档没有关于路线的大量信息,但教程有这个页面:

http://docs.angularjs.org/tutorial/step_07

John Lindquist的优秀短视频教程也是值得关注的。处理路线的是:

http://www.egghead.io/video/gNtnxRzXj8s

答案 3 :(得分:0)

这里是通用解决方案 - uibPagination指令装饰器和更新后的模板:

angular.module('ui.bootstrap.pagination')
    .config(function($provide) {
        $provide.decorator('uibPaginationDirective', function($delegate, $templateCache) {
            var directive = $delegate[0];
            directive.scope.getPageHref = "&";
            $templateCache.put("uib/template/pagination/pagination.html",
                "<li ng-if=\"::boundaryLinks\" ng-class=\"{disabled: noPrevious()||ngDisabled}\" class=\"pagination-first\"><a ng-href=\"{{noPrevious() ? '' : getPageHref()(1)}}\" ng-disabled=\"noPrevious()||ngDisabled\" uib-tabindex-toggle>{{::getText('first')}}</a></li>\n" +
                "<li ng-if=\"::directionLinks\" ng-class=\"{disabled: noPrevious()||ngDisabled}\" class=\"pagination-prev\"><a ng-href=\"{{noPrevious() ? '' : getPageHref()(page - 1)}}\" ng-disabled=\"noPrevious()||ngDisabled\" uib-tabindex-toggle>{{::getText('previous')}}</a></li>\n" +
                "<li ng-repeat=\"page in pages track by $index\" ng-class=\"{active: page.active,disabled: ngDisabled&&!page.active}\" class=\"pagination-page\"><a ng-href=\"{{getPageHref()(page.number)}}\" ng-disabled=\"ngDisabled&&!page.active\" uib-tabindex-toggle>{{page.text}}</a></li>\n" +
                "<li ng-if=\"::directionLinks\" ng-class=\"{disabled: noNext()||ngDisabled}\" class=\"pagination-next\"><a ng-href=\"{{noNext() ? '' : getPageHref()(page + 1)}}\" ng-disabled=\"noNext()||ngDisabled\" uib-tabindex-toggle>{{::getText('next')}}</a></li>\n" +
                "<li ng-if=\"::boundaryLinks\" ng-class=\"{disabled: noNext()||ngDisabled}\" class=\"pagination-last\"><a ng-href=\"{{noNext() ? '' : getPageHref()(totalPages)}}\"  ng-disabled=\"noNext()||ngDisabled\" uib-tabindex-toggle>{{::getText('last')}}</a></li>\n" +
                "");
            return $delegate;
        });
    });

我们使用从外部作用域传递的getPageHref函数来装饰该指令,该作用域用于构造页面链接。

用法:

<div ng-controller="ProductController">
    ...
    <ul uib-pagination
        total-items="totalItems"
        ng-model="page"
        get-page-href="getPageHref">
    </ul>
</div>

现在您必须在外部范围中定义getPageHref函数:

angular.module('app')
.controller('ProductController', function($scope) {
    ...
    $scope.getPageHref = function(page) {
        return '#/products?page=' + page;
    };
});

答案 4 :(得分:0)

为了让代码看起来更好,您可以在template-url元素上使用uib-pagination属性 指定新模板网址

我应该使用ui-sref而不是使用函数来生成链接。

而不是为每个页面重新加载控制器而不是使用ng-click传递$event的函数,这样就可以防止href被执行 使用e.preventDefault()并在

之前调用您的ajax
<li ng-repeat="page in pages track by $index" ng-class="{active: page.active}"><a ui-sref="list({page: page.text})"  ng-click="$root.paginationClick(page.number,$event)">{{page.text}}</a></li>