2015-02-08 82 views
9

你好,我试图手动引导一个角度的应用程序,但有一些业务,需要首先照顾。 This文章中提到我感兴趣的技术

当我注入这一点:

var $injector = angular.injector(["ng"]); 
var $http = $injector.get("$http"); 

它工作正常,但:

var $injector= angular.injector(["ng", "myApp"]); 
var $location = $injector.get("$location"); 

抛出下面的错误。

Uncaught Error: [$injector:unpr] Unknown provider: $rootElementProvider <- $rootElement <- $location <- $location 

是否有可能在angular.bootstrap之前获得$ location?

谢谢!

回答

12

为了在引导前获得$location,您基本上需要提供$rootElement。一种方法是嘲笑它:从angular-mocks注入ngMock模块以获取喷油器。

var $injector= angular.injector(['ng','ngMock',"plunker"]); 
var $location = $injector.get("$location"); 

Plunker

或通过创建一个模拟的应用程序,并包括在获取注射器在自己的供应rootElement的。

var mockApp = angular.module('mockApp', []).provider({ 
    $rootElement:function() { 
    this.$get = function() { 
     return angular.element('<div ng-app></div>'); 
    }; 
    } 
}); 

var $injector= angular.injector(['ng','mockApp',"plunker"]); 

var $location = $injector.get("$location"); 

Plunker

或者其他方式(根据您的可行性)是获得使用window.location窗口的位置。

另外值得注意github

+0

这回答我的问题,但没有解决我的问题。我所需要的位置之一就是.search方法,并且当以这种方式注入时位置似乎处于奇怪的状态,并且对象返回为空。 – Jeremythuff 2015-02-09 05:54:58

+0

为什么我不使用window.location.search?什么是你的最终目标。 – PSL 2015-02-09 06:29:08

+0

我最终这样做了。我们的应用程序中有一些工厂需要安装$ location,我们需要它们的功能预引导。我试图通过使用这些服务避免重复代码。 – Jeremythuff 2015-02-09 07:12:17

2

根元素在此线程必须在插入文档。 请参阅http://plnkr.co/edit/OrgStgw4NpjU2LcIFXsB

var rootElement = angular.element(document); 

var mockApp = angular.module('mockApp', []).provider({ 
    $rootElement:function() { 
    this.$get = function() { 
     return rootElement; 
    }; 
    } 
}); 
相关问题