2013-12-17 44 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