Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 为什么不应该';t我通过提供程序访问工厂函数。$get在配置阶段?_Angularjs_Angularjs Factory_Angularjs Provider - Fatal编程技术网

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方法)