2013-12-09 1 views
1

В контексте приведенной ниже настройки, как бы сказать родительскому контроллеру (ZoneController), что-то произошло в дочернем контроллере (ZoneCodeController)?Как сообщить родительскому контроллеру состояния что-то произошло в контроллере дочерних состояний

.state('zone', 
{ 
    url:'/zone', 
    controller:'ZoneController', 
    templateUrl:'views/zone.html' 
}) 
.state('zone.code', 
{ 
    url:'/:zoneCode', 
    controller:'ZoneCodeController', 
    templateUrl:function(stateParams) 
    { 
     return 'views/zone-codes/'+stateParams.zoneCode+'.html'; 
    } 
} 
+0

определить 'что-то happened'. Можно обмениваться данными через службу или использовать пользовательские события, которые также могут передавать данные по всему приложению. – charlietfl

+0

Мне нужно только обновить таблицу, ничего больше. Поэтому я хотел бы, чтобы родительский контроллер знал, что хэш местоположения изменился и у него есть данные для хэша местоположения. – Francisc

ответ

2

Если вы хотите подписаться на родительский контроллер на событие, которое происходит внутри дочернего, вы можете использовать $ emit.

.controller('ZoneController', function ($scope) { 
    $scope.$on('eventName', function (data) { 
     // Do something. 
    }); 
}) 

.controller('ZoneCodeController', function ($scope) { 

    $scope.somethingHappened = function() { 
     var data = {key: 'value'}; 

     // Publish the event up the controller hierarchy. 
     $scope.$emit('eventName', data); 
    } 

}); 

Альтернативно, если вы просто хотите поделиться данными, услуга, вероятно, будет лучшим выбором.

3

Рекомендуемый способ - создать службу для обмена данными между контроллерами. Я создал что-то вроде:

angular.module('MODULENAME', []).factory('SharedHashTable', function($rootScope, $log) { 
    var data = {}; 

    return { 
     set: function(key, value) { 
      data.key = value; 
     }, 
     get: function(key) { 
      return data.key; 
     } 

    }; 
}); 

Затем вы можете добавить SharedHashTable к тому, что контроллер может вызвать его набор или получить методы:

// in controller 1 
SharedHashTable.set("MyData", $scope.myData); 
// in controller 2 
$scope.otherData = SharedHashTable.get("MyData"); 
+0

, но будет SharedHashTable.get («MyData»); в контроллере 2 всегда запускаются при SharedHashTable.set ("MyData", $ scope.myData); в контроллере 1 выполняется? – Shardul

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