2014-09-15 1 views
5

J'écris une application de navigateur, et j'ai un fichier qui crée un objet et l'initialise. L'application est écrite en AngularJS, mais le fichier en question est Javascript, en dehors de l'écosystème angulaire.

Je veux utiliser des promesses dans ce dossier, mais depuis angulaire contient un an implementation de Q, je préférerais utiliser que de mettre dans une autre bibliothèque. J'utilise aussi RequireJS.

Donc, est-il possible d'utiliser $ q dans un fichier non angulaire?

+0

Je ne vois pas pourquoi pas - juste le passer au moment opportun. –

Répondre

9

Vous pouvez le faire en utilisant la méthode angular.injector() qui retourne une fonction $injector qui peut être injecté avec des dépendances dont vous avez besoin (par exemple $http, $q) par sa méthode invoke().

DEMO

Quelque chose comme ceci:

angular.injector(['ng']).invoke(['$q', function($q) { 

    $q.when('hello world').then(function(message) { 
    window.alert(message); 
    }); 

}]); 

Notez que le tableau est passé à angular.injector() est une liste de modules, j'inclus le module ng parce que c'est là que les dépendances de base AngularJS sont situés .

+0

Mais de cette façon, '' $ q'' utilisera un '' $ rootScope'' différent du reste de l'application. Donc, l'utilisation de $ rootScope. $ Apply() '' sur le "normal" '' $ rootScope'' (par exemple dans les tests unitaires) ne fonctionnera pas pour ce '' $ q'', n'est-ce pas? – Ignitor

+0

@Ignitor. Ce n'est pas nécessairement vrai, le module 'ng' est techniquement ajouté en tant que dépendance pour tous les modules. Par conséquent, le '$ rootScope' pour le module que vous créez partage également le' $ rootScope' du module 'ng'. A l'écriture de ce commentaire, la version angular.js est 1.5.8, vous verrez que le module 'ng' est ajouté comme module par défaut pour tous les modules du processus d'amorçage, [** dans cette ligne **] (https://github.com/angular/angular.js/blob/v1.5.8/src/Angular.js#L1688). De plus, les services, les fournisseurs, les usines et les valeurs angularjs natifs résident dans ce module. – ryeballar

+0

Juste essayé: J'ai enregistré une référence à '' $ rootScope'' dans un contrôleur et je l'ai comparé au '' $ rootScope'' que j'ai obtenu: '' angular.injector (['ng']) .invoke (['$ rootScope', fonction ($ rootScope) { console.dir ($ rootScope); }]) ''. Ils ne * correspondent * pas et ont même des '' $ id'' différents. – Ignitor

Questions connexes