2013-12-17 21 views
17

是否可以在模块的config部分注入$ q?以下是我的示例配置部分。

.config(['$q', function ($q) { 
    var func = function (inp) { 
     var def = $q.defer(); 

     if (inp == 1) 
      def.resolve("Success"); 
     else 
      def.reject("Failure"); 

     return def.promise; 
    }; 

    alert(func(1)); 
}]); 

我得到的第一个错误是 未捕获的错误:未知的供应商:从ReportModule $ Q如果我改变

.config(['$q', function ($q) {}]) 

.config(['$qProvider', function ($q) {}]) 

然后我得到一个错误说未捕获TypeError:对象#没有方法从ReportModule'推迟'

好像我不能在配置部分注入$ q。是这种情况还是我做错了什么?我有一个用例,我需要在我的模块的配置部分中使用$ q和$ http进行初始化。有没有一些技术可以做到这一点?

+2

'run'模块上的方法在配置阶段之后运行,也许你可以使用它。 – Chandermani

回答

18

正确 - 您无法从配置功能注入$ http或$ q。它们尚未提供(它们也正在配置中!)。

+0

请参阅下面的回答以获取注入'$ http'和'$ q'的方法。 –

4

它可以让我(当路由配置):

resolve: { 
    simpleStringParam: ["$q", "$timeout", function($q, $timeout){ 
     var deferred = $q.defer(); 
      $timeout(function(){ 
       deferred.resolve("Allo!"); 
      },8000); 
     return deferred.promise; 
    }] 
} 
+0

这个工作,谢谢,但为什么超时? – khoailang

+0

khoailang,它只是示例:) $超时是一种模拟异步操作的方式。取而代之,您可以使用$ http,任何异步服务或不需要使用 – iamarsey

4

您可以使用angular.injector在你的配置块加载$http$q,以及可能的其他服务:

angular.module('myApp').config(function() { 
    var injector = angular.injector(['ng']), 
     http = injector.get('$http'), 
     q = injector.get('$q'); 
}); 
+2

问题在于您正在注入可能未配置的服务。配置阶段没有'$ http'和'$ q'这样的配置不能保证是确定性的。在任何情况下,这可能会或可能不会一直工作。 –

+0

确实如此,应谨慎使用,不是最佳做法。但这是可能的。 –

+1

-1因为'angular.injector(['ng'])'创建了一个新的注入器,这意味着您将获得使用该注入器获得的所有内容的新实例。看[我的小提琴](https://jsfiddle.net/AlexanderS/Lexb8da8/)。这很难理解,并可能导致非常意想不到的结果。 '$ q'和'$ http'不应该直接在配置阶段使用。还有其他的可能性。 – AlexS

相关问题