2015-02-08 11 views
9

Ciao sto provando a riavviare manualmente un'app angolare, ma ci sono alcune attività che devono essere risolte prima. This articolo cita la tecnica Sono interessato a

quando mi inietto questo:.

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

funziona benissimo, ma questo:

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

lancia il seguente errore.

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

È possibile ottenere $ posizione prima di angular.bootstrap?

Grazie mille!

risposta

12

Per ottenere $location prima dell'avvio automatico, è necessario fornire lo $rootElement. Un modo è quello di deriderlo: iniettare il modulo ngMock da angular-mocks per ottenere l'iniettore.

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

Plunker

O rootElement approvvigionamento da soli con la creazione di un'applicazione finto e compreso che durante il recupero l'iniettore.

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

O altro modo (in base alla fattibilità) è quello di ottenere la posizione dalla finestra utilizzando window.location.

anche opportuno notare questa discussione su github

+0

Questo non risponde alla mia domanda, ma non ha risolto il mio problema. Una delle cose di cui avevo bisogno dalla posizione era il metodo .search, e la posizione sembra essere in uno stato strano quando viene iniettata in questo modo e l'oggetto viene restituito vuoto. – Jeremythuff

+0

Perché non uso solo window.location.search? Qual è il tuo obiettivo finale. – PSL

+0

Ho finito per fare proprio questo. Ci sono alcune fabbriche nella nostra app che contengono $ location e avevamo bisogno della loro funzionalità pre-bootstrap. Stavo cercando di evitare di avere un codice duplicato usando quei servizi. – Jeremythuff

2

elemento principale deve essere inserita in nel documento. Vedi http://plnkr.co/edit/OrgStgw4NpjU2LcIFXsB

var rootElement = angular.element(document); 

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