2016-11-16 3 views
2

Я использую угловой пейджер с помощьюКак мне вызвать метод в дочернем контроллере?

<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?

ответ

1

В то время как ответ от ответа Сравана будет работать, лучше $broadcast с текущего $scope, так что только эти контроллеры получат это событие. С $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(); } 

Хотя это был не ваш вопрос, даже еще лучше, чтобы общаться между контроллерами через услуг/заводов.

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.

+0

@ Андерс Линден, пожалуйста, проверьте мой ответ. – Sravan

+0

Спасибо за ответ! Я хотел принять оба ваших ответа и использовать генератор случайности, чтобы решить, какой из ответов я должен принять. –

+0

Правда, но мне нравились оба ответа. –

Смежные вопросы