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

Unknown provider: $rootElementProvider when using $injector to get $location service before angular.bootstrap

本文关键字:获取 injector location rootE 服务 程序 bootstrap angular 未知      更新时间:2023-09-26

你好,我正在尝试手动引导一个angular应用程序,但有一些业务需要首先处理。这篇文章提到了我感兴趣的技术。

当我注入这个:

 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吗?

非常感谢!

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

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

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