345

How and where is app.run() used? After module definition, after app.config() or after app.controller()?

I am adopting the BreezeJS Angular Q, which asks whether certain code can be run in the app.run() function.

1
  • 2
    and after any angular module .constants() have been set Commented Dec 18, 2013 at 16:22

2 Answers 2

660

Here's the calling order:

  1. app.config()
  2. app.run()
  3. directive's compile functions (if they are found in the dom)
  4. app.controller()
  5. directive's link functions (again, if found)

Here's a simple demo where you can watch each one executing (and experiment if you'd like).

From Angular's module docs:

Run blocks - get executed after the injector is created and are used to kickstart the application. Only instances and constants can be injected into run blocks. This is to prevent further system configuration during application run time.

Run blocks are the closest thing in Angular to the main method. A run block is the code which needs to run to kickstart the application. It is executed after all of the services have been configured and the injector has been created. Run blocks typically contain code which is hard to unit-test, and for this reason should be declared in isolated modules, so that they can be ignored in the unit-tests.

One situation where run blocks are used is during authentications.

Sign up to request clarification or add additional context in comments.

9 Comments

@KayakDave I'm not sure if this is off topic but in relation to the run order you mentioned above, when would Services be initiated and when would they be run?
It's probably a little bit late to help you @jonnieM, but services will be executed depending upon when they're needed first - i.e. if you first need a service in a run block, it will execute immediately before that block. As for providers, annoyingly, they will run either before or after config blocks - depending on which order they come in the code. Considering that the only time you directly use a provider is at the config stage, this doesn't seem right.
hi, i've forked and modified your fiddle sample to show also factory load: jsfiddle.net/lorezz/4cxgpLqj/1
Awesome. To be thorough, app.constant() functions get invoked before everything... And app.factory() and other service functions get invoked "lazily." In other words, Angular uses the provided functions to create a service instance only when a controller or another service needs it injected, even if that's long after the app has been initialized.
In an Ionic project, by default run is called before config. Why is that ?
|
30

Specifically...

How and where is app.run() used? After module definition or after app.config(), after app.controller()?

Where:

In your package.js E.g. /packages/dashboard/public/controllers/dashboard.js

How:

Make it look like this

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'
});

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.