首先,这是一个诚实的问题。而且我正在寻找诚实和合理的答案,为什么我不应该这样做...
angular
.module('X', ['Y'])
.config(function (myFactoryProvider, myServiceProvider) {
myFactoryProvider.$get().myFn();
myServiceProvider.$get().myFn();
});
angular
.module('Y', [])
.factory('myFactory', ['$location', function ($location) {
return {
myFn: function () {
console.log('factory');
console.log($location.absUrl());
}
}
}])
.service('myService', ['$location', function ($location) {
this.myFn = function () {
console.log('service');
console.log($location.absUrl());
}
}]);
这是一个JSFiddle:http://jsfiddle.net/1vetnu6o/
这正如你在上面看到的那样工作,它为我解决了一些问题。但我不应该这样做,我想了解原因。我真的需要很好的理由不这样做。尽管事实上我真的想要。
TL;博士;
以下是问题的背景......
我有多个产品使用的内部框架,其中有一个服务(恰好是工厂),它基本上包含一组相关的帮助方法。在这种情况下,设备相关,如isMobileDevice
,isAndroid
,getDeviceType
(返回mobile
,tablet
或desktop
),以及其他一些设备。
必须使用框架将此服务注入应用程序的config()
阶段,因为我们需要访问getDeviceType
函数。问题是,我们需要deviceType
使用$routeProvider
加载适当的模板。在config()
阶段,我们正在构建用于所有路由的正确模板路径。其中一些取决于deviceType
,而另一些则依赖于设备的通用模板。
由于这是一项服务,我们无法将其直接注入config()
阶段,但我们可以使用前面提到的技术调用该方法。
我目前如何解决这个问题?辅助服务实际上是一个提供者,所有方法都在提供者部分和工厂函数中公开。不理想,但它的工作原理。我认为这是一种解决方法,但我宁愿在应用程序而不是框架中进行解决,因此首先提到的技术。
思想?
答案 0 :(得分:0)
我不知道,但实际上你可以在配置阶段调用。 问题是myService将被实例化两次:/
angular
.module('X', [])
.config(function(myServiceProvider) {
myServiceProvider.$get().myFn();
})
.run(function(myService) {
myService.myFn();
})
.service('myService', ['$location', function($location) {
console.log('myService!');
this.myFn = function() {
console.log($location.absUrl());
}
}]);
输出:
"myService!"
"location"
"myService!"
"location"
如果您对具有大嵌套依赖关系树的服务的配置调用$ get,则危险:/
答案 1 :(得分:0)
我认为正确的方法,如果你需要一个实用程序服务(没有依赖),就是使用一个常量(这样你可以将它注入到任何地方)。否则,如果您需要依赖项,请使用服务并坚持使用run()块。
config()阻止它指示您的服务如何在其提供者的帮助下工作。
run()阻止它是你的应用程序启动时做一些逻辑的理想场所(又名主要方法)。