Documentation sur AngularJS app.run ()?

337

Comment et où est-il app.run()utilisé? Après la définition du module, après app.config()ou après app.controller()?

J'adopte le BreezeJS Angular Q , qui demande si certains codes peuvent être exécutés dans la app.run()fonction.

user3071284
la source
2
et après que tout module angulaire .constants () ait été défini
alfonsob

Réponses:

650

Voici l'ordre d'appel:

  1. app.config()
  2. app.run()
  3. fonctions de compilation de la directive (si elles se trouvent dans le dom)
  4. app.controller()
  5. fonctions de liaison de la directive (encore une fois, si elles sont trouvées)

Voici une démonstration simple où vous pouvez regarder chacun s'exécuter (et expérimenter si vous le souhaitez).

À partir des documents du module Angular :

Exécuter les blocs - exécutez -vous après la création de l'injecteur et utilisez-le pour démarrer l'application. Seules les instances et les constantes peuvent être injectées dans des blocs d'exécution. Cela permet d'empêcher une configuration supplémentaire du système pendant l'exécution de l'application.

Les blocs d'exécution sont la chose la plus proche dans Angular de la méthode principale. Un bloc d'exécution est le code qui doit être exécuté pour démarrer l'application. Il est exécuté une fois que tous les services ont été configurés et que l'injecteur a été créé. Les blocs d'exécution contiennent généralement du code difficile à tester, et pour cette raison, ils doivent être déclarés dans des modules isolés, afin qu'ils puissent être ignorés dans les tests unitaires.

Une situation où des blocs d'exécution sont utilisés est lors des authentifications .

KayakDave
la source
4
@KayakDave Je ne sais pas si c'est hors sujet mais par rapport à l'ordre d'exécution que vous avez mentionné ci-dessus, quand les services seront-ils lancés et quand seront-ils exécutés?
jonnie
3
Il est probablement un peu tard pour vous aider @jonnieM, mais les services seront exécutés en fonction du moment où ils sont nécessaires en premier - c'est-à-dire si vous avez d'abord besoin d'un service dans un bloc d'exécution, il s'exécutera immédiatement avant ce bloc. Quant aux fournisseurs, ennuyeux, ils s'exécuteront avant ou après les blocs de configuration - selon l'ordre dans lequel ils viennent dans le code. Étant donné que la seule fois où vous utilisez directement un fournisseur est au stade de la configuration, cela ne semble pas correct.
Zac Seth
2
salut, j'ai bifurqué et modifié votre échantillon de violon pour afficher également la charge d'usine: jsfiddle.net/lorezz/4cxgpLqj/1
Lorezz
1
Impressionnant. Pour être complet, les fonctions app.constant () sont invoquées avant tout ... Et app.factory () et d'autres fonctions de service sont invoquées "paresseusement". En d'autres termes, Angular utilise les fonctions fournies pour créer une instance de service uniquement lorsqu'un contrôleur ou un autre service a besoin de l'injecter, même si c'est longtemps après que l'application a été initialisée.
Niko Bellic
Dans un projet Ionic, l'exécution par défaut est appelée avant la configuration. Pourquoi donc ?
Rayjax
28

Plus précisément...

Comment et où est-il app.run()utilisé? Après la définition du module ou après app.config(), après app.controller()?

Où:

Dans votre package.js Eg /packages/dashboard/public/controllers/dashboard.js

Comment:

Faites comme ça

var app = angular.module('mean.dashboard', ['ui.bootstrap']);

app.controller('DashboardController', ['$scope', 'Global', 'Dashboard',
    function($scope, Global, Dashboard) {
        $scope.global = Global;
        $scope.package = {
            name: 'dashboard'
        };
        // ...
    }
]);

app.run(function(editableOptions) {
    editableOptions.theme = 'bs3'; // bootstrap3 theme. Can be also 'bs2', 'default'
});
Michael Cole
la source