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é?

27
demandé sur Dor Cohen 2013-06-26 16:17:35

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".

42
répondu mitch 2018-01-31 19:57:42

L'utilisation de la ligne suivante aide à exécuter ma méthode à partir du service angularjs:

angular.element('*[ng-app]').injector().get("MyService").GetName ();
14
répondu Dor Cohen 2013-06-27 12:40:26

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")
14
répondu user3081007 2016-08-03 14:04:02

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)

0
répondu Fabii 2016-10-17 19:05:13