diff --git a/modules/angular2/src/core/compiler/element_injector.ts b/modules/angular2/src/core/compiler/element_injector.ts index 497e6237b0..98b0682182 100644 --- a/modules/angular2/src/core/compiler/element_injector.ts +++ b/modules/angular2/src/core/compiler/element_injector.ts @@ -486,11 +486,11 @@ export class ElementInjector extends TreeNode implements Depend this._addDirectivesToQueries(); this._addVarBindingsToQueries(); + this.hydrated = true; + // TODO(rado): optimize this call, if view queries are not moved around, // simply appending to the query list is faster than updating. this._updateViewQueries(); - - this.hydrated = true; } private _updateViewQueries() { @@ -1164,7 +1164,7 @@ export class QueryRef { } visit(inj: ElementInjector, aggregator: any[]): void { - if (isBlank(inj) || !inj._hasQuery(this)) return; + if (isBlank(inj) || !inj._hasQuery(this) || !inj.hydrated) return; if (this.query.isVarBindingQuery) { this._aggregateVariableBindings(inj, aggregator); diff --git a/modules/angular2/test/core/compiler/query_integration_spec.ts b/modules/angular2/test/core/compiler/query_integration_spec.ts index bf20b9279e..4335bdc932 100644 --- a/modules/angular2/test/core/compiler/query_integration_spec.ts +++ b/modules/angular2/test/core/compiler/query_integration_spec.ts @@ -103,6 +103,24 @@ export function main() { }); })); + it('should be cleanly destroyed when a query crosses view boundaries', + inject([TestComponentBuilder, AsyncTestCompleter], (tcb: TestComponentBuilder, async) => { + var template = + '
' + + '
' + + '
'; + + tcb.overrideTemplate(MyComp, template) + .createAsync(MyComp) + .then((rtc) => { + rtc.componentInstance.shouldShow = true; + rtc.detectChanges(); + rtc.destroy(); + + async.done(); + }); + })); + it('should reflect moved directives', inject([TestComponentBuilder, AsyncTestCompleter], (tcb: TestComponentBuilder, async) => { var template =