2014-02-06 27 views
1

假設我有一個名爲MyFactory的工廠,我將它注入到多個控制器中。我如何訪問工廠內的控制器範圍?

我目前想到的就如何做到這一點的唯一方法如下:

app.factory('MyFactory', function() { 

    return function($scope) { 
     myPublicFunc: function() { 
      $scope.$on('$destroy', function() { ... }); 
     } 
    } 

}); 

app.controller('MyController1', ['$scope', MyFactory', function($scope, Myfactory) { 
    var factory = new MyFactory($scope); 
    factory.myPublicFunc(); 
}); 

但有沒有其他辦法,我可以只在MyFactory返回{ }而不是function($scope) { },並直接使用工廠( MyFactory.myPublicFunc),而不必創建一個新的實例new關鍵字仍然可以訪問每個控制器的$範圍

+1

服務被設計爲在作用域之間共享,並且不應該依賴於控制器的作用域。我不認爲有辦法做到這一點 –

+0

@KhanhTO我在問題中發佈的例子正在工作,至少有這種方式。 –

+0

我從來沒有談論依賴注入。我只想訪問工廠內的範圍。我仍然認爲我可以對它進行單元測試,我只需要模擬工廠內部的函數,我不需要測試內部的範圍。只有*原因我需要工廠內部的範圍是處理銷燬事件,所以我不必在所有使用該特定工廠的控制器中複製代碼。 –

回答

0

如果你使用的.service代替.factory你已經有一個單一實例的控制,一旦你通過DI

注入它

再比如,你可以做

module.service('myService', function() { 
    return { 
     myPublicFn: function() {} 
    } 
}); 

module.controller('myCtrl', function(myService, $scope) { 
    $scope.publicFn = myService.myPublicFn; 
}); 
+0

我不認爲你瞭解我的問題。我稍微更新了這個問題以更好地解釋這個問題。 –

+0

我想你主要是想擺脫工廠的實例...所以你想擺脫範圍注入 - 這不是一個好主意,因爲@KhanhTO提到,服務不應該有任何範圍的依賴,如果它有,邏輯沒有很好的設計,範圍操縱應該保留在控制器 – doodeec

+0

這不是範圍操作。我只是不想爲每個控制器複製相同的代碼。我需要在各種控制器中的範圍銷燬事件具有相同的行爲。這是我將範圍傳遞給工廠的唯一原因。 –