Как я могу получить инжектор для своего приложения?

#angularjs

#angularjs

Вопрос:

Я пытаюсь запустить функцию и внедрить в нее службы. Я думал, что это можно было бы легко сделать с помощью $injector . Итак, я попробовал следующее (упрощенный пример):

 angular.injector().invoke( [ "$q", function( $q ) { $q.something(); } ] );
 

Что приводит к Uncaught Error: [$injector:unpr] Unknown provider: $qProvider <- $q .

Я знаю, что могу решить эту проблему, используя angular.injector( ["ng"] ) вместо этого, но на самом деле есть еще несколько зависимостей.

Было бы прекрасно, если бы я мог просто получить экземпляр инжектора, который используется везде в моем приложении.

Документация angular.injector предполагает, что вы можете получить его с angular.element(document).injector() помощью, но это приводит undefined ко мне.

Ответ №1:

Вам это не нужно, но вы можете получить $injector вашего приложения, используя корневой элемент вашего приложения (или любой дочерний элемент).
Например, если вы используете ngApp в теле:

 angular.element(document.body).injector();
 

Комментарии:

1. Как вы сказали, мне, вероятно, это не должно было понадобиться. Мой подход к моей проблеме, вероятно, был неправильным с самого начала. Однако ваш код сработал, как и пример, я просто использовал его в неподходящее время в процессе настройки.

Ответ №2:

Ответ ExpertSystem отлично сработал для меня

Это отлично работает для меня. Я пытаюсь вызвать функцию из службы angular за пределами области angular в событии document «resume» для использования в моем приложении cordova. Вот код, который я использовал

 var injector = angular.element(document.body).injector(); //get the document
injector.invoke(['myService', function (myService) {
    myService.doSomething();
}]);
 

Ответ №3:

Попробуйте это:

 var $injector = angular.injector(['myApp','ng'])
 

Потому $location что вам нужно загрузить приложение на страницу (запустить приложение).:

 var $injector = angular.bootstrap(document, ['myApp'])
 

Это будет возвращать инжектор каждый раз, когда вы его вызываете, но не создаст никаких конфликтов, если скрипт уже был загружен.

Комментарии:

1. Это приводит к Unknown provider: $rootElementProvider <- $rootElement <- $location

2. Это приведет к тому, что «приложение уже загружено». Я не думаю, что мой подход к проблеме, с которой я столкнулся, был правильным с самого начала.

3. @OliverSalzburg это не для меня, но конечно 🙂

4. Обратите внимание, что этот подход вернет не $injector приложения, а новый экземпляр. Таким образом, вы не можете обмениваться данными и т. Д