我使用
使用角度寻呼机<script type="text/javascript" src="Scripts/angular-pager.js"></script>
在MainController中,我有一个像
这样的PagerController<body>
<div ng-app="myapp" ng-controller="mainController">
<div ng-controller="PagerController as vm" data-entities="Bookings"
data-pagesize="10">
</div>
</body>
该寻呼机控制器使用http使用数据实体中的信息填充自身,如
var app = angular.module("myapp", ["ng"])
.controller("mainController", function ($scope, $http, $filter)
{
/* a lot of code */
})
.factory('PagerService', PagerService)
.controller('PagerController', function (PagerService, $http, $scope, $attrs)
{
var vm = this;
var pageSize = $attrs["pagesize"];
var entities = $attrs["entities"];
vm.update = function ()
{
setPage(vm.pager.currentPage);
};
vm.setPage = setPage;
initController();
function initController()
{
setPage(1);
}
function setPage(page)
{
$http.get(entities + "/" + page + "/" + pageSize).success(function (result)
{
var numPages = Math.ceil(result.totalNumItems / pageSize);
vm.pager = PagerService.GetPager(result.totalNumItems, numPages, page);
vm.items = result.items;
});
}
});
当我在主控制器中完成操作时,我需要更新寻呼机,因为这些操作导致数据发生了变化。如何从mainController中的代码调用寻呼机的更新函数?
答案 0 :(得分:1)
您可以使用rootscope broadcast
来实现解决方案。
$rootScope.$broadcast
正在通过应用范围发送事件。该应用的任何子级范围都可以使用简单的$scope.$on()
。
在您的mainController
中,完成更改后,您可以使用参数调用$rootScope.$broadcast()
方法。
var app = angular.module("myapp", ["ng"])
.controller("mainController", function ($scope, $http, $filter,$rootScope)
{
/* a lot of code */
$rootScope.$broadcast('page_changed', {page : $scope.page});
})
在PagerController
中,您可以使用$rootScope.$on()
$rootScope.$on('page_changed', function(event, obj){
console.log(obj.page);
vm.update(obj.page);
})
<强> PagerController:强>
.controller('PagerController', function (PagerService, $http, $scope, $attrs,$rootScope)
{
var vm = this;
var pageSize = $attrs["pagesize"];
var entities = $attrs["entities"];
$rootScope.$on('page_changed', function(event, obj){
console.log(obj.page);
vm.update(obj.page)
})
vm.update = function ()
{
setPage(vm.pager.currentPage);
};
vm.setPage = setPage;
initController();
function initController()
{
setPage(1);
}
function setPage(page)
{
$http.get(entities + "/" + page + "/" + pageSize).success(function (result)
{
var numPages = Math.ceil(result.totalNumItems / pageSize);
vm.pager = PagerService.GetPager(result.totalNumItems, numPages, page);
vm.items = result.items;
});
}
});
因此,只要main controller
中的某些内容发生变化,只需更改广播,就会更新pager controller
。
答案 1 :(得分:1)
虽然@Sravan的答案会起作用,但最好从当前$scope
$broadcast开始,所以只有这些控制器的孩子才能收到该事件。
使用$rootScope
,您将实际$broadcast
事件发送到所有范围/控制器。
另外,不要忘记取消注册您的监听器以防止可能的泄漏。
<强> mainController 强>
$scope.$broadcast('pageChange', $scope.page);
<强> PagerController 强>
var unregisterPageChangeListener = $scope.$on('pageChange', function(event, updatedPage){
vm.pager.currentPage = updatedPage;
vm.update();
});
$scope.$on('$destroy', function() { unregisterPageChangeListener(); }
虽然这不是你的问题,但更好的办法是通过服务/工厂在控制器之间进行沟通。