2014-07-24 139 views
0

因此,這不是典型的如何去做的問題。我知道這可以通過服務或工廠完成,但我想知道是否有人可以分享創建基本服務的優點/缺點,將其注入每個控制器,然後使用每個控制器的功能擴展服務。類似於下面的示例..AngularJS,在控制器之間共享數據

app.service('HelperService', function() { 
    return {}; 
}); 

app.controller('Controller1', function($scope, HelperService) { 
    $scope.somefunc = function() { 
     //do stuff here 
    }; 
    HelperService.somefunc = $scope.somefunc; 
}); 

app.controller('Controller2', function($scope, HelperService) { 
    HelperService.somefunc(); 
}); 

這個工程,運作良好。我對這個問題感到有點愚蠢,但是似乎我在這裏錯過了一些關於爲什麼沒有使用或推薦的東西?

+0

服務是單身,所以你可以擴展它們。如果你有控制器添加功能,它會變得混亂,爲什麼不首先建立你的服務? – lucuma

+0

是的,不可否認,它可能會變得雜亂無章,並且在服務中做得更乾淨些。我只是好奇,如果有這樣做的利弊(除了雜亂)。 – dferg

+0

考慮嘗試*維護*更大的應用程序,其中控制器將功能添加到服務和其他控制器中,調用這些功能。 – lucuma

回答

0

該服務是一個單例,它將在函數本身調用new後實例化 - 您傳入的函數本質上是一個構造函數。這會創建空的對象,你可以在任何地方使用,但是如果你想以這種方式返回一個對象,那麼使用.factory更合理,但這不是什麼大不了的事。

無論如何,你可以考慮你的代碼在概念上做到這一點:

var HelperService = function() {} 
var helperService = new HelperService; 

function Controller1() { 
    helperService.someFunc = function() {} 
} 
function Controller2() { 
    helperService.someFunc(); 
} 

我會認爲這是一個危險的事情了幾個理由這樣做:

  1. Controller1必須實例Controller2之前或somefunc將不會提供給Controller2。理想情況下,管制員不會彼此瞭解。
  2. 您將Controller/ViewModel(因爲您使用範圍)與服務級別邏輯耦合在一起,但這些應該是分離的。 HelperService也不應該知道控制器。相反,您應該注入一個具有控制器期望使用的API的服務。這並不總是必須是HelperService,它只需要看起來像HelperService控制器和它的API不應該改變。

不知道你想做什麼的具體細節,很難提供建議。一般來說,您可能會重新考慮您想要做什麼,但您可以使用其他服務來擴展服務的功能。考慮將服務置於其自己的層面。

1

它可能工作,但它是一個壞主意。

  • 控制器2 HelperService.somefunc()不會存在,直到Controller1已經被實例化。因此,在一個地方,它可以被理解起來
  • 如果你正在做某種數據操作在功能那裏有的Controller2Controller1
  • HelperService代碼隱式的依賴是不是,真的應該在操作由HelperService封裝的數據。
相關問題