2015-10-23 29 views
1

考慮到下面的模塊,如何在不依賴AngularJS的依賴注入的情況下直接調用RESTService.get直接調用AngularJS上工廠實例化的對象

angular.module('RESTModule', ['ngResource']). 
    factory('RESTService', ['$resource', function($resource) { 
     return $resource('http://jsonplaceholder.typicode.com/posts/1', {}); 
    } 
    ]); 

我希望能夠創建類似下面的一個,做由工廠創建的對象的直接調用庫的方法,但如我所料factory()不起作用。

var MyLibrary = {}; 
MyLibrary.method = function() { 
    // ... 
    // The line below miserably fails... :-(
    angular.module('RESTModule').factory('RESTService').get(); 
}; 

我可以做這一切錯了,應該考慮寫一個AngularJS服務......但我堅持就可以了,我決定找你幫忙。

謝謝!附註:我正在編寫一個應用程序,它可以讓開發人員在其上包含自己的窗體(視圖),以及他們自己的模塊來控制這些視圖(我在這裏做得很好)。

但不是強制他們在自己的代碼中注入模塊(如RESTModule),而是想讓他們調用「靜態」庫方法(如MYLibrary.method)。

+0

感謝您的編輯,羅裏·奧凱恩。 – Cotta

回答

2
angular.element(document.querySelector('*[ng-app]')).injector().get('RESTService'); 

應該做的工作,但你必須確保角已經加載完成依賴注入象下面這樣:

var restService; 
var timer = setTimeout(function(){ 
    if(angular && 
     angular.element(document.querySelector('*[ng-app]')).injector()) 
    { 
     clearTimeout(timer); 
     restService = angular.element(document.querySelector('*[ng-app]')).injector().get('RESTService'); 
    }}, 1000); 
+0

似乎工作!有沒有一種替代方法可以在不引用DOM元素的情況下獲得注入器?在我的情況下,我必須先調用angular.bootstrap(document,['MyApplication']),以便我可以安全地執行angular.element(document).injector(),這更多的是爲了自我認識。 – Cotta

+1

也許你可以嘗試angular.injector([「RESTModule」])。get(「RESTService」)。從DOM中檢索注入器會返回角度應用程序運行的注入器,但是此angular.injector([moduleName])也適用於我。 – bl0u0l

0

有一個事實。你的方法需要$資源才能正常工作。 如果您通過Angular使用,它會爲您注入該依賴關係,並且$資源不會未定義。

如果您想直接調用該方法,請將該方法分配給一個var,並用您自己的$ resource對象調用它。

var factoryMethod=function($resource) { 
     return $resource('http://jsonplaceholder.typicode.com/posts/1', {}); 
    }; 
angular.module('RESTModule', ['ngResource']). 
    factory('RESTService', ['$resource', factoryMethod]); 
// factoryMethod(<your object>); will work 

我沒有真正瞭解動態用戶給定表單的細節。但該方法可以稱爲正常。

+0

這個問題是我仍然依賴於應該注入的$ resource的引用。 bl0u0l的答案澄清了我實際需要的一點,那就是手動獲取注入器然後從中獲取對象的方法。 – Cotta

+0

我很困惑。在你的問題中,你需要獲得沒有Angular DI的對象。這就是爲什麼我提到我的解決方案。但似乎你需要Angular創建你的對象 –