angular/angular.js — pull request #7147 by caitp (2014-04-17 14:21:40+00:00)
Title: fix(injector): invoke config blocks for module after all providers

This change ensures that a module's config blocks are always invoked after all
of its providers are registered.

NOTE: I'm not entirely sure if this is desirable yet, because the point mentioned
in the BREAKING CHANGE section below may actually be something which is desirable.
However, I do feel it is probably better to always invoke config blocks for a single
module after all of its providers. The config blocks should not play a role in how
providers are registered, in my own opinion.

BREAKING CHANGE:

Previously, config blocks would be able to control behaviour of provider
registration, due to being invoked prior to provider registration. Now,
provider registration always occurs prior to configuration for a given module,
and therefore config blocks are not able to have any control over a providers
registration.

Example:

Previously, the following:

angular.module('foo', [])
.provider('$rootProvider', function() {
this.$get = function() { ... }
})
.config(function($rootProvider) {
$rootProvider.dependentMode = "B";
})
.provider('$dependentProvider', function($rootProvider) {
if ($rootProvider.dependentMode === "A") {
this.$get = function() {
// Special mode!
}
} else {
this.$get = function() {
// something else
}
}
});

would have "worked", meaning behaviour of the config block between the
registration of "$rootProvider" and "$dependentProvider" would have actually
accomplished something and changed the behaviour of the app. This is no longer
possible within a single module.

Fixes #7139