web-dev-qa-db-fra.com

Appelez le service angularjs à partir d'un simple code js

J'ai le service angularjs suivant:

angular.module('app.main').factory('MyService', ["$http", function ($http) {
    return new function () {

        this.GetName = function () {
            return "MyName";
        };
    };
}]);

Comment appeler la fonction GetName à partir de MyService à partir de code js hérité

29
Dor Cohen

Utilisez angular.injector . 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é, car votre exemple de code dépend du fournisseur $ http qui se trouve dans le module ng.

EDIT - En utilisant get() comme dans la réponse de l'OP mais notez que ce code récupère le service sans que l'élément soit lié au module d'application "main.app". 

43
mitch

Pour moi cela a fonctionné avec: 

angular.element(document.body).injector().get("MyService")

J'ai eu l'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 supportés par jqLite, mais j'ai eu l'idée de [Dor Cohen]. Ma directive ng-app est sur mon tag body, alors je peux utiliser:

angular.element(document.body).injector().get("MyService")

ou 

angular.element(document).find('body').injector().get("MyService")
15
user3081007

L’utilisation de la ligne suivante permet d’exécuter ma méthode à partir du service angularjs:

angular.element('*[ng-app]').injector().get("MyService").GetName ();
15
Dor Cohen

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.body)

0
Fabii