diff --git a/modules/@angular/upgrade/src/aot/upgrade_module.ts b/modules/@angular/upgrade/src/aot/upgrade_module.ts index f7f6814f76..ba23ec13e7 100644 --- a/modules/@angular/upgrade/src/aot/upgrade_module.ts +++ b/modules/@angular/upgrade/src/aot/upgrade_module.ts @@ -150,10 +150,12 @@ export class UpgradeModule { */ bootstrap( element: Element, modules: string[] = [], config?: any /*angular.IAngularBootstrapConfig*/) { + const INIT_MODULE_NAME = UPGRADE_MODULE_NAME + '.init'; + // Create an ng1 module to bootstrap - const upgradeModule = + const initModule = angular - .module(UPGRADE_MODULE_NAME, modules) + .module(INIT_MODULE_NAME, []) .value(INJECTOR_KEY, this.injector) @@ -205,6 +207,8 @@ export class UpgradeModule { } ]); + const upgradeModule = angular.module(UPGRADE_MODULE_NAME, [INIT_MODULE_NAME].concat(modules)); + // Make sure resumeBootstrap() only exists if the current bootstrap is deferred const windowAngular = (window as any /** TODO #???? */)['angular']; windowAngular.resumeBootstrap = undefined; diff --git a/modules/@angular/upgrade/test/aot/integration/injection_spec.ts b/modules/@angular/upgrade/test/aot/integration/injection_spec.ts index 26f07429be..0924609931 100644 --- a/modules/@angular/upgrade/test/aot/integration/injection_spec.ts +++ b/modules/@angular/upgrade/test/aot/integration/injection_spec.ts @@ -6,11 +6,12 @@ * found in the LICENSE file at https://angular.io/license */ -import {InjectionToken, NgModule, destroyPlatform} from '@angular/core'; +import {InjectionToken, Injector, NgModule, destroyPlatform} from '@angular/core'; import {async} from '@angular/core/testing'; import {BrowserModule} from '@angular/platform-browser'; import {platformBrowserDynamic} from '@angular/platform-browser-dynamic'; import * as angular from '@angular/upgrade/src/angular_js'; +import {$INJECTOR, INJECTOR_KEY} from '@angular/upgrade/src/aot/constants'; import {UpgradeModule, downgradeInjectable} from '@angular/upgrade/static'; import {bootstrap, html} from '../test_helpers'; @@ -76,5 +77,27 @@ export function main() { expect(ng2Injector.get(Ng1Service)).toBe('ng1 service value'); }); })); + + it('should initialize the upgraded injector before application run blocks are executed', + async(() => { + let runBlockTriggered = false; + + const ng1Module = angular.module('ng1Module', []).run([ + INJECTOR_KEY, + function(injector: Injector) { + runBlockTriggered = true; + expect(injector.get($INJECTOR)).toBeDefined(); + } + ]); + + @NgModule({imports: [BrowserModule, UpgradeModule]}) + class Ng2Module { + ngDoBootstrap() {} + } + + bootstrap(platformBrowserDynamic(), Ng2Module, html('