错误:[$ injector:unpr]未知提供者:$ q。对DI语法感到困惑

时间:2015-09-12 14:26:53

标签: angularjs angularjs-provider

代码段1不起作用。我收到错误:[$ injector:unpr]未知提供商:$ q

/* Snippet 1*/
var mApp = angular.module('MyApp',[]);
mApp.provider('authProvider', ['$q', function($q) {
    this.$get = function(){

        authProvider = {};
        authProvider.Title = function(){

            var deferred = $q.defer();
            deferred.resolve("promise resolved");
            return deferred.promise;

        }
        return authProvider;
    }
}]);

但是,Snippet 2可以使用。我很困惑为什么会这样?我读过的所有工厂样本代码,在第一行注入依赖项,如 .factory(' MyFactory',[$ q,function($ q){}]); 为什么这种风格在上面的提供者代码中不起作用?另外,为什么我们在GET声明中注入$ q以下但在TITLE声明中没有进一步下注。

/* Snippet 2*/
mApp.provider('authProvider', function() {
    this.$get = function($q){

        authProvider = {};
        authProvider.Title = function(){

            var deferred = $q.defer();
            deferred.resolve("promise resolved");
            return deferred.promise;

        }
        return authProvider;
    }
});

请帮助!!!

(代码现在没有做任何事情。我只是想学习语法)

2 个答案:

答案 0 :(得分:3)

您无法在provider中执行直接DI,当您使用provider时,必须在$get中注入您的组件。

您无法直接向provider注入依赖关系的原因是provider在模块加载阶段运行,而$get在实例化您提供的服务时运行。

在模块的加载/配置阶段,您无法使用任何服务。

答案 1 :(得分:1)

  

我已阅读的所有工厂示例代码,在第一行中注入依赖项,例如.factory('MyFactory',[$q,function($q) {}]);为什么这种样式在上面的提供程序代码中不起作用?

此图片始终帮助我了解providerfactory之间的区别:

xxxxxx http://www.simplygoodcode.com/wp-content/uploads/2015/11/angularjs-provider-service-factory-highlight.png

factory函数是$get的{​​{1}}函数。 注入之前,provider构造函数可以配置provider函数。 $get函数是注入发生的地方。

$get构造函数不可注入。这就是你得到那个错误的原因。 provider函数是可注入的,这是您使用$get指定的函数。 factory只是用于创建带有空构造函数的factory的语法糖。