fix(ngUpgrade): to work with @NgModule

We changed the bootstrap order:
1. create NgZone
2. bootstrap ng1 inside NgZone and upgrade ng1 components to ng2 components.
3. bootstrap ng2 with NgZone

Note: Previous footgun behavior was: bootstrap ng2 first to extract NgZone, so that ng1 bootstrap can happen in NgZone. This meant that if ng2 bootstrap eagerly compiled a component which contained ng1 components, then we did not have complete metadata.
This commit is contained in:
Igor Minar
2016-08-05 13:32:04 -07:00
committed by Misko Hevery
parent 37f138e83d
commit d21331e902
7 changed files with 179 additions and 85 deletions

View File

@ -127,7 +127,7 @@ export class UpgradeNg1ComponentAdapterBuilder {
compileTemplate(
compile: angular.ICompileService, templateCache: angular.ITemplateCacheService,
httpBackend: angular.IHttpBackendService): Promise<any> {
httpBackend: angular.IHttpBackendService): Promise<angular.ILinkFn> {
if (this.directive.template !== undefined) {
this.linkFn = compileHtml(
typeof this.directive.template === 'function' ? this.directive.template() :
@ -162,10 +162,13 @@ export class UpgradeNg1ComponentAdapterBuilder {
}
}
/**
* Upgrade ng1 components into Angular 2.
*/
static resolve(
exportedComponents: {[name: string]: UpgradeNg1ComponentAdapterBuilder},
injector: angular.IInjectorService): Promise<any> {
var promises: any[] /** TODO #9100 */ = [];
injector: angular.IInjectorService): Promise<angular.ILinkFn[]> {
var promises: Promise<angular.ILinkFn>[] = [];
var compile: angular.ICompileService = injector.get(NG1_COMPILE);
var templateCache: angular.ITemplateCacheService = injector.get(NG1_TEMPLATE_CACHE);
var httpBackend: angular.IHttpBackendService = injector.get(NG1_HTTP_BACKEND);
@ -176,7 +179,8 @@ export class UpgradeNg1ComponentAdapterBuilder {
exportedComponent.directive = exportedComponent.extractDirective(injector);
exportedComponent.$controller = $controller;
exportedComponent.extractBindings();
var promise = exportedComponent.compileTemplate(compile, templateCache, httpBackend);
var promise: Promise<angular.ILinkFn> =
exportedComponent.compileTemplate(compile, templateCache, httpBackend);
if (promise) promises.push(promise);
}
}