From 2f015cc3360647243e379e2a4cabc04b6f98ad8f Mon Sep 17 00:00:00 2001 From: Rado Kirov Date: Wed, 25 Feb 2015 14:41:10 -0800 Subject: [PATCH] fix(view_container): fixes injection on dynamically added views. Closes #777 --- .../src/core/compiler/view_container.js | 4 ++- .../test/core/compiler/integration_spec.js | 25 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/modules/angular2/src/core/compiler/view_container.js b/modules/angular2/src/core/compiler/view_container.js index c92fd8f2dc..785f787e1a 100644 --- a/modules/angular2/src/core/compiler/view_container.js +++ b/modules/angular2/src/core/compiler/view_container.js @@ -74,8 +74,10 @@ export class ViewContainer { 'Cannot create views on a dehydrated ViewContainer'); // TODO(rado): replace with viewFactory. var newView = this.defaultProtoView.instantiate(this.hostElementInjector, this._eventManager); + // insertion must come before hydration so that element injector trees are attached. + this.insert(newView, atIndex); newView.hydrate(this.appInjector, this.hostElementInjector, this.parentView.context); - return this.insert(newView, atIndex); + return newView; } insert(view, atIndex=-1): viewModule.View { diff --git a/modules/angular2/test/core/compiler/integration_spec.js b/modules/angular2/test/core/compiler/integration_spec.js index f38ce164af..e18c46326e 100644 --- a/modules/angular2/test/core/compiler/integration_spec.js +++ b/modules/angular2/test/core/compiler/integration_spec.js @@ -19,6 +19,8 @@ import {Decorator, Component, Viewport} from 'angular2/src/core/annotations/anno import {Template} from 'angular2/src/core/annotations/template'; import {Parent, Ancestor} from 'angular2/src/core/annotations/visibility'; +import {If} from 'angular2/src/directives/if'; + import {ViewContainer} from 'angular2/src/core/compiler/view_container'; export function main() { @@ -365,6 +367,29 @@ export function main() { done(); }) }); + + it('should create a component that injects an @Ancestor through viewport directive', (done) => { + tplResolver.setTemplate(MyComp, new Template({ + inline: ` + +

+ +

+
`, + directives: [SomeDirective, CompWithAncestor, If] + })); + + compiler.compile(MyComp).then((pv) => { + createView(pv); + cd.detectChanges(); + + var subview = view.viewContainers[0].get(0); + var childComponent = subview.contextWithLocals.get('child'); + expect(childComponent.myAncestor).toBeAnInstanceOf(SomeDirective); + + done(); + }) + }); }); // TODO support these tests with DART e.g. with Promise.catch (JS) transpiled to Future.catchError (DART)