Позвоните в службу angularjs из простого кода js
У меня есть следующее угловое обслуживание:
angular.module('app.main').factory('MyService', ["$http", function ($http) {
return new function () {
this.GetName = function () {
return "MyName";
};
};
}]);
Как я могу вызвать функцию GetName
из MyService
из устаревшего кода js?
Ответы
Ответ 1
Используйте angular.injector. Используя свой код, вы можете сделать что-то вроде следующего:
angular.module('main.app', []).factory('MyService', ['$http', function ($http) {
return new function () {
this.GetName = function () {
return "MyName";
};
};
}]);
angular.injector(['ng', 'main.app']).get("MyService").GetName();
Вот jsfiddle: http://jsfiddle.net/wGeNG/
ПРИМЕЧАНИЕ. Перед загрузкой пользовательского модуля вам необходимо добавить "ng" в качестве вашего первого модуля, так как ваш примерный код зависит от поставщика $http, который находится в модуле ng.
EDIT. Используя get()
, как в ответе OP , но, обратите внимание, что этот код извлекает услугу, не полагаясь на элемент, связанный с модулем приложения "main.app".
Ответ 2
Использование следующей строки помогает выполнить мой метод из службы angularjs:
angular.element('*[ng-app]').injector().get("MyService").GetName ();
Ответ 3
Для меня это сработало с:
angular.element(document.body).injector().get("MyService")
У меня была ошибка "Неизвестный поставщик" при попытке:
angular.injector(['ng', 'main.app']).get("MyService")
и поскольку я использую jqLite, я не могу сделать
angular.element('*[ng-app]')
потому что селекторы не поддерживаются jqLite, но я получил идею [Дор Коэн]. Моя директива ng-app находится на моем теге тела, затем я могу использовать:
angular.element(document.body).injector().get("MyService")
или
angular.element(document).find('body').injector().get("MyService")
Ответ 4
Вот полезный метод, который я использую:
function getService(name, element) {
element = element || '*[ng-app]';
return angular.element(element).injector().get(name);
}
getSrv("name-of_service", document.
тела)