2013-12-07 4 views
1

В последнее время я много работаю с AngularJS, и мне очень нравится материал для инъекций зависимостей. Я использую его повсюду, но только в Угловых компонентах, таких как контроллеры и т. П.AngularJS DI для пользовательских функций

Это всегда вызывает на угловом объекте:

angular.module('app').controller(/**/); 

Теперь у меня есть эта функция:

var custom = function(MyService) { 
    // do stuff 
}; 

Я объявленная на службу так:

angular.module('app').factory('MyService', function($rootScope) { 
    return { 
     show: function() { 
      // do stuff 
       }; 
     }, 
     hide: function() { 
      // do stuff 
     } 
    }; 
}); 

я теперь хотите использовать эту службу в моей пользовательской функции. Есть ли способ ручного вызова углового контейнера DI? (Я не мог найти что-либо в документации ...)

Я знаю, что это работает для контроллеров не определен с angular.module()... вещью:

function Controller(MyService) { 
    MyService.hide(); // works 
} 

Но как использовать его вне AngularJS компонентов, в полностью независимые функции?

Или мне нужно сделать совершенно другой путь для достижения моей цели?

Приветствие и спасибо передового,

христианских

ответ

4

angularjs очень аккуратный в том, что он выставляет свои собственные внутренние услуги пользователя. Услуги вы ищете, $injector

То, что вы хотите использовать для вызова пользовательской функции $injector.invoke(myCustomFunction,thisForCustomFunction,{named:locals});

Если вы случайно желая вызвать эту функцию за пределами угловых вы должны получить приложение инжектор.

var injector = angular.element(elementWithNgApp).injector();

Примечание:

время вызова может быть уменьшено, хотя. Поскольку инжектор должен аннотировать (найти, какие услуги вам нужны), используя несколько регулярных выражений. Причина, по которой это не проблема во всех углах, заключается в том, что она выполняется один раз. Потому что услуги, заводы, провайдеры - это все созданные (новые) синглтоны, которые обеспечивают закрытие сервисов и независимо от того, что использует услуги внутри ваших провайдеров.

Чтобы предотвратить этот дополнительный шаг, вы можете предоставить свойство $inject в своей функции. это:

myfunction.$inject = ['ServiceA','ServiceB']; 
function myfunction(a,b){ 
    //a is ServiceA 
    //b is ServiceB 
}; 
+0

Thats pretty awesome. Не знал об этом. BTW: вы также можете использовать 'angular.injector()' для получения инжектора. – DaGardner

+0

'angular.injector()' даст вам новый инжектор. Который не будет иметь никаких ваших услуг. – calebboyd

+0

Ох. Спасибо за этот намек: D – DaGardner

Смежные вопросы