AngularJS:分页时附加到url页码
AngularJS: Append to url the page number while paginating
我正在开发一个应用程序,我通过像 random/api/endpoint?page=1/2/3
这样调用服务器来对一些记录进行分页
现在我在分页时,
我需要将我请求的页面附加到 url,例如 http://www.paginate.com/somedata/{1/2/3}
,并且在打开此 url 时,它还应该在视图中获取该特定页面 {意思是如果我导航至 hhtp://www.paginate.com/somedata/4
,然后 app/view 应反映来自 api 调用 random/api/endpoint?page=4
} 的数据。
目前我正在使用 angular-route 1.4.12 与 AngularJS 相同的版本。 angular(2 天)非常新,如有任何帮助,我们将不胜感激。
编辑: 我想做什么?
当我在分页时单击下一步时,它应该将 pageNumber 附加到 url。
route.js
angular
.module('mainRouter', ['ngRoute'])
.config(['$routeProvider', function ($routeProvider) {
$routeProvider.
when('/somedata/:page', {
templateUrl: 'partials/somedata.html',
controller: 'PaginationCtrl',
controllerAs: 'vm',
reloadOnSearch: false
}).
otherwise( { redirectTo: "/somedata/1" });
}
]);
PaginationCtrl.js
angular
.module('controllers.Pagination', [])
.controller('PaginationCtrl', PaginationCtrl);
PaginationCtrl.$inject = ['$routeParams', 'paginationService'];
function PaginationCtrl ($routeParams, paginationService) {
var vm = this;
vm.paginationData = {
perPage: 10,
currentPage: 1
};
vm.isLoading = false;
vm.paginate = paginate;
paginate(vm.paginationData.currentPage);
calculateTotalPages();
function calculateTotalPages () {
paginationService.findAll(0, 0)
.success(function (res) {
var paginationData = vm.paginationData || {};
paginationData.totalPages = Math.ceil(res.count / paginationData.perPage);
})
.error(function (res) {
console.log('Error trying to get the total number of pages', res);
});
}
function paginate (pageNumber, perPage) {
vm.isLoading = true;
var paginationData = vm.paginationData || {};
if (! perPage) {
perPage = paginationData.perPage;
}
console.log($routeParams);
paginationService.findAll(perPage, pageNumber)
.success(function (res) {
paginationData.items = res.documents;
vm.isLoading = false;
})
.error(function (res) {
console.log('Error fetching more Logs', res);
});
}
}
PaginationService.js
angular
.module('services.Pagination', [])
.service('paginationService', PaginationService);
PaginationService.$inject = ['$http', 'Constants'];
function PaginationService ($http, Constants) {
// console.log($http);
this.findAll = function (perPage, page) {
var url = Constants.baseUrl + '/sms/get/data';
if (page > 0) {
url += '?page=' + page;
}
return $http.get(url);
};
}
正在使用指令
var app = angular.module('directives.Pagination', []);
app.directive('pagination', [function () {
return {
restrict: 'E',
template: '<div class="ui pagination menu"> \
<a class="icon item" ng-click="vm.previous()"><i class="left arrow icon"></i></a> \
<div class="icon item">{{ vm.paginationData.currentPage }} / {{ vm.paginationData.totalPages }}</div> \
<a class="icon item" ng-click="vm.next()"><i class="right arrow icon"></i></a> \
</div>',
scope: '=',
link: function (scope, element, attrs) {
var vm = scope.vm;
vm.paginationData.currentPage = 1;
vm.next = function () {
vm.paginationData.currentPage++;
if (vm.paginationData.currentPage > vm.paginationData.totalPages) {
vm.paginationData.currentPage = vm.paginationData.totalPages;
}
vm.paginate(vm.paginationData.currentPage);
};
vm.previous = function () {
vm.paginationData.currentPage--;
if (vm.paginationData.currentPage < 1) {
vm.paginationData.currentPage = 1;
}
vm.paginate(vm.paginationData.currentPage);
};
}
};
}]);
您应该能够通过 $routeParams
访问您的 :page
参数,您已经将其注入控制器。
只需使用 $routeParams.page
而不是默认值 1 来调用分页。
为了随时更新url(以允许用户复制url供以后使用的方式),而不更新路由和重新初始化控制器,你可以调用 $location.search({page: page})
。当调用 reloadOnSearch 设置为 false 时(正如您已经完成的那样),它不应该重新初始化控制器。
最后,如果不清楚,您必须在拨打 API 电话的同时更新 URL。没有内置的 angular 方法来执行此操作,但它应该非常简单。
我正在开发一个应用程序,我通过像 random/api/endpoint?page=1/2/3
现在我在分页时,
我需要将我请求的页面附加到 url,例如 http://www.paginate.com/somedata/{1/2/3}
,并且在打开此 url 时,它还应该在视图中获取该特定页面 {意思是如果我导航至 hhtp://www.paginate.com/somedata/4
,然后 app/view 应反映来自 api 调用 random/api/endpoint?page=4
} 的数据。
目前我正在使用 angular-route 1.4.12 与 AngularJS 相同的版本。 angular(2 天)非常新,如有任何帮助,我们将不胜感激。
编辑: 我想做什么?
当我在分页时单击下一步时,它应该将 pageNumber 附加到 url。
route.js
angular
.module('mainRouter', ['ngRoute'])
.config(['$routeProvider', function ($routeProvider) {
$routeProvider.
when('/somedata/:page', {
templateUrl: 'partials/somedata.html',
controller: 'PaginationCtrl',
controllerAs: 'vm',
reloadOnSearch: false
}).
otherwise( { redirectTo: "/somedata/1" });
}
]);
PaginationCtrl.js
angular
.module('controllers.Pagination', [])
.controller('PaginationCtrl', PaginationCtrl);
PaginationCtrl.$inject = ['$routeParams', 'paginationService'];
function PaginationCtrl ($routeParams, paginationService) {
var vm = this;
vm.paginationData = {
perPage: 10,
currentPage: 1
};
vm.isLoading = false;
vm.paginate = paginate;
paginate(vm.paginationData.currentPage);
calculateTotalPages();
function calculateTotalPages () {
paginationService.findAll(0, 0)
.success(function (res) {
var paginationData = vm.paginationData || {};
paginationData.totalPages = Math.ceil(res.count / paginationData.perPage);
})
.error(function (res) {
console.log('Error trying to get the total number of pages', res);
});
}
function paginate (pageNumber, perPage) {
vm.isLoading = true;
var paginationData = vm.paginationData || {};
if (! perPage) {
perPage = paginationData.perPage;
}
console.log($routeParams);
paginationService.findAll(perPage, pageNumber)
.success(function (res) {
paginationData.items = res.documents;
vm.isLoading = false;
})
.error(function (res) {
console.log('Error fetching more Logs', res);
});
}
}
PaginationService.js
angular
.module('services.Pagination', [])
.service('paginationService', PaginationService);
PaginationService.$inject = ['$http', 'Constants'];
function PaginationService ($http, Constants) {
// console.log($http);
this.findAll = function (perPage, page) {
var url = Constants.baseUrl + '/sms/get/data';
if (page > 0) {
url += '?page=' + page;
}
return $http.get(url);
};
}
正在使用指令
var app = angular.module('directives.Pagination', []);
app.directive('pagination', [function () {
return {
restrict: 'E',
template: '<div class="ui pagination menu"> \
<a class="icon item" ng-click="vm.previous()"><i class="left arrow icon"></i></a> \
<div class="icon item">{{ vm.paginationData.currentPage }} / {{ vm.paginationData.totalPages }}</div> \
<a class="icon item" ng-click="vm.next()"><i class="right arrow icon"></i></a> \
</div>',
scope: '=',
link: function (scope, element, attrs) {
var vm = scope.vm;
vm.paginationData.currentPage = 1;
vm.next = function () {
vm.paginationData.currentPage++;
if (vm.paginationData.currentPage > vm.paginationData.totalPages) {
vm.paginationData.currentPage = vm.paginationData.totalPages;
}
vm.paginate(vm.paginationData.currentPage);
};
vm.previous = function () {
vm.paginationData.currentPage--;
if (vm.paginationData.currentPage < 1) {
vm.paginationData.currentPage = 1;
}
vm.paginate(vm.paginationData.currentPage);
};
}
};
}]);
您应该能够通过 $routeParams
访问您的 :page
参数,您已经将其注入控制器。
只需使用 $routeParams.page
而不是默认值 1 来调用分页。
为了随时更新url(以允许用户复制url供以后使用的方式),而不更新路由和重新初始化控制器,你可以调用 $location.search({page: page})
。当调用 reloadOnSearch 设置为 false 时(正如您已经完成的那样),它不应该重新初始化控制器。
最后,如果不清楚,您必须在拨打 API 电话的同时更新 URL。没有内置的 angular 方法来执行此操作,但它应该非常简单。