未知提供者:$rootElementProvider 使用 $injector 在 angular.bootstrap 之前获取 $location 服务时

Posted

技术标签:

【中文标题】未知提供者:$rootElementProvider 使用 $injector 在 angular.bootstrap 之前获取 $location 服务时【英文标题】:Unknown provider: $rootElementProvider when using $injector to get $location service before angular.bootstrap 【发布时间】:2015-04-08 14:00:33 【问题描述】:

您好,我正在尝试手动引导 Angular 应用程序,但有一些业务需要首先处理。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 ?

非常感谢!

【问题讨论】:

【参考方案1】:

为了在引导之前获得$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上的这个帖子

【讨论】:

这确实回答了我的问题,但没有解决我的问题。我从 location 需要的东西之一是 .search 方法,当以这种方式注入时,location 似乎处于奇怪的状态,并且对象返回为空。 为什么我不直接使用 window.location.search?你的最终目标是什么。 我最终做到了。我们的应用程序中有一些工厂连接 $location,我们需要它们的功能预引导。我试图通过使用这些服务来避免重复代码。【参考方案2】:

根元素必须插入到文档中。 见http://plnkr.co/edit/OrgStgw4NpjU2LcIFXsB

var rootElement = angular.element(document);

var mockApp = angular.module('mockApp', []).provider(
  $rootElement:function() 
     this.$get = function() 
       return rootElement;
    ;
  
);

【讨论】:

以上是关于未知提供者:$rootElementProvider 使用 $injector 在 angular.bootstrap 之前获取 $location 服务时的主要内容,如果未能解决你的问题,请参考以下文章

angularjs $routeProvider 不包括视图(未知提供者)

Angular js未知提供者

AngularJS 错误:$injector:unpr 未知提供者

AngularJS / Sqlite / Electron - 未知提供者:$dbServiceProvider

未知提供者:$routeParamsProvider <- $routeParams

Angular Bootstrap 模态:未知提供者:$modalInstanceProvider