2015-04-21 22 views
3

我這種情況

兩個文件,無論是在相同的應用程序

var app = angular.module('myapp'); 

文件一個是父,我有:

app.controller("ControllerOne", ['$scope', '$http', '$modal', 
function ($scope, $http, $modal) { 


$scope.$on('refreshList', function (event, data) { 
    console.log(data); 
}); 

$scope.openModal = function() { 

    var modalInstance = $modal.open({ 
     templateUrl: '/SomeFolder/FileWithControllerTwo', 
     controller: 'ControllerTwo', 
     size: 'lg', 
     resolve: { 
      someParam: function() { 
       return "param" 
      } 
     } 
    }); 
} 

}]); 

文件中的兩個是小孩,我有:

app.controller("ControllerTwo", ['$scope', '$http', 'someParam', 
    function ($scope, $http, someParam) { 


     $scope.SaveSomething = function() { 

      $http.post(url, obj) 
       .success(function (data) { 

         $scope.$emit('refreshList', [1,2,3]); 

       }).error(function() { 

       }); 

     }; 

    }]); 

假設我可以打開模式,我可以「SaveSomething」。

我需要做些什麼來從ControllerTwo發送一些數據給ControllerOne?

我已經檢查過這個職位Working with $scope.$emit and .$on 但我無法解決問題呢。

觀測數據:

  • FileOne.js - >我有ControllerOne(parrent) - > $上
  • FileTwo.js - >我有ControllerTwo(孩子) - > $發出
  • 是的,我可以打到$ http.post.success裏面的代碼

回答

5

假設你使用的是angular-ui bootstrap(它有一個$模型),那麼模型中的$ scope就是$ rootScope的子範圍。

根據$model documentation您可以通過使用scope選項,這將使模式的$scope無論你提供一個孩子提供ControllerOne$scope。因此:

var modalInstance = $modal.open({ 
    templateUrl: '/SomeFolder/FileWithControllerTwo', 
    controller: 'ControllerTwo', 
    size: 'lg', 
    scope: $scope, 
    resolve: { 
     someParam: function() { 
      return "param" 
     } 
    } 
}); 

然後你可以發射到使用$scope.$parent.$emit(...)。嚴格來說,這會產生一種耦合,因爲它假設模態的user監聽事件。

如果你不想注入你的示波器,他們可以注入$rootScope然後發射。但是,這也會將事件發送到應用程序中的每個範圍。

這是假設您實際上想要打開模式並將消息發送回父控制器。否則,只需使用close()dismiss()方法。

+1

hello @ajkavanagh 非常感謝你 只需提供模態子$範圍解決了我的問題。 現在我可以從父控制器調用一個函數,並將我想要的數據傳遞給$之前,現在它工作正常。 –

+0

Hi @GilianMoa:只是爲了澄清:你是否不需要使用'$ scope。$ parent。$ emit(...)'來發送消息。即'$ scope。$ emit(...)'工作了嗎?如果是這樣,我會修改我的答案來澄清這一點。謝謝。 – ajkavanagh

+0

嗨@ajkavanagh, 我不需要使用$ emit和$ on, 只是通過$範圍,當我打開模式已經解決了我的問題 –