Appelez le service angularjs à partir du code JS simple
J'ai le service angularjs suivant:
angular.module('app.main').factory('MyService', ["$http", function ($http) {
return new function () {
this.GetName = function () {
return "MyName";
};
};
}]);
Comment puis-je appeler la fonction GetName
depuis MyService
depuis le code JS hérité?
4 réponses
Utilisez angulaire.injecteur. En utilisant votre code, vous pouvez faire quelque chose comme ceci:
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();
Voici le jsfiddle: http://jsfiddle.net/wGeNG/
NOTE - Vous devez ajouter " ng " comme premier module avant de charger votre module personnalisé puisque votre exemple de code dépend du fournisseur $ http qui est dans le module ng.
EDIT - en utilisant get()
comme dans la réponse D'OP mais notez que ce code récupère le service sans compter sur le élément lié au module d'application " main.App".
L'utilisation de la ligne suivante aide à exécuter ma méthode à partir du service angularjs:
angular.element('*[ng-app]').injector().get("MyService").GetName ();
Pour moi, cela a fonctionné avec:
angular.element(document.body).injector().get("MyService")
J'ai eu une erreur 'fournisseur inconnu' quand j'ai essayé ceci:
angular.injector(['ng', 'main.app']).get("MyService")
Et comme j'utilise jqLite, Je ne peux pas faire
angular.element('*[ng-app]')
Parce que les sélecteurs ne sont pas pris en charge par jqLite, mais j'ai eu [Dor Cohen] idée. Mon directive ng-app est sur ma balise body, alors je peux utiliser:
angular.element(document.body).injector().get("MyService")
Ou
angular.element(document).find('body').injector().get("MyService")
Voici une méthode utilitaire que j'utilise :
function getService(name, element) {
element = element || '*[ng-app]';
return angular.element(element).injector().get(name);
}
getSrv("name-of_service", document.
corps)