为什么我不能通过提供商访问工厂功能。$进入配置阶段?

时间:2015-03-24 22:13:26

标签: angularjs angularjs-factory angularjs-provider

首先,这是一个诚实的问题。而且我正在寻找诚实和合理的答案,为什么我不应该这样做...

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;博士;

以下是问题的背景......

我有多个产品使用的内部框架,其中有一个服务(恰好是工厂),它基本上包含一组相关的帮助方法。在这种情况下,设备相关,如isMobileDeviceisAndroidgetDeviceType(返回mobiletabletdesktop),以及其他一些设备。

必须使用框架将此服务注入应用程序的config()阶段,因为我们需要访问getDeviceType函数。问题是,我们需要deviceType使用$routeProvider加载适当的模板。在config()阶段,我们正在构建用于所有路由的正确模板路径。其中一些取决于deviceType,而另一些则依赖于设备的通用模板。

由于这是一项服务,我们无法将其直接注入config()阶段,但我们可以使用前面提到的技术调用该方法。

我目前如何解决这个问题?辅助服务实际上是一个提供者,所有方法都在提供者部分和工厂函数中公开。不理想,但它的工作原理。我认为这是一种解决方法,但我宁愿在应用程序而不是框架中进行解决,因此首先提到的技术。

思想?

2 个答案:

答案 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()阻止它是你的应用程序启动时做一些逻辑的理想场所(又名主要方法)。