11

您好,我正在尝试手动引导 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 ?

万分感谢!

4

2 回答 2

14

为了获得$location之前的引导,您基本上需要提供$rootElement. 一种方法是对其进行模拟:注入ngMock模块 fromangular-mocks以获取注入器。

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

普朗克

或者通过创建一个模拟应用程序并在获取注入器时包含它来自行提供 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");

普朗克

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

同样值得注意的是github上的这个线程

于 2015-02-08T23:00:35.877 回答
4

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

var rootElement = angular.element(document);

var mockApp = angular.module('mockApp', []).provider({
  $rootElement:function() {
     this.$get = function() {
       return rootElement;
    };
  }
});
于 2015-02-26T20:03:37.380 回答