2013-12-09 25 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); 
    } 

}); 

Alternatiely如果你只是想分享數據服務可能是更好的選擇。

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

相關問題