Angularjs 为什么不应该';t我通过提供程序访问工厂函数。$get在配置阶段?
首先,这是一个诚实的问题。我正在寻找诚实和合理的答案,解释我为什么不应该这样做Angularjs 为什么不应该';t我通过提供程序访问工厂函数。$get在配置阶段?,angularjs,angularjs-factory,angularjs-provider,Angularjs,Angularjs Factory,Angularjs Provider,首先,这是一个诚实的问题。我正在寻找诚实和合理的答案,解释我为什么不应该这样做 angular .module('X', ['Y']) .config(function (myFactoryProvider, myServiceProvider) { myFactoryProvider.$get().myFn(); myServiceProvider.$get().myFn(); }); angular .module('Y',
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());
}
}]);
下面是一个JSFIDLE:
这是工作,你可以看到上面,它为我解决了一些问题。但我不应该这么做,我想知道为什么。我真的需要很好的理由不这样做。尽管事实上我真的很想
tl;博士强>
这是问题的背景
我有多个产品使用的内部框架,其中有一个服务(碰巧是一个工厂),基本上包含一组相关的助手方法。在这种情况下,与设备相关的设备,如isMobileDevice
,isAndroid
,getDeviceType
(返回mobile
,tablet
或desktop
),以及其他一些设备
必须使用框架将此服务注入应用程序的config()
阶段,因为我们需要访问getDeviceType
函数。问题是,我们需要让deviceType
使用$routeProvider
加载适当的模板。在config()
阶段,我们正在构建用于所有路由的正确模板路径。其中一些依赖于设备类型
,而另一些则具有独立于设备的通用模板
由于这是一个服务,我们不能将其直接注入config()
阶段,但我们可以使用我在本文前面提到的技术调用该方法
我目前是如何解决这个问题的?helper服务实际上是一个提供者,所有方法都在提供者部分以及工厂函数中公开。虽然不理想,但它确实有效。我认为这是一个工作,但是我宁愿在应用程序中而不是在框架中工作,因此首先提到的技术。
想法?我不知道,但实际上您可以在配置阶段调用。 问题是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,这是非常危险的。://我认为,如果您需要一个实用程序服务(没有依赖关系),正确的方法是使用常量(通过这种方式,您可以在任何地方注入它)。否则,如果需要依赖项,请使用服务并坚持使用run()块 config()块用于指导您的服务如何在提供者的帮助下工作 run()块是在应用程序启动时执行某些逻辑的最佳位置(也称为main方法)