From 1f7a41c963b31ceed8435fbc5045374807457e30 Mon Sep 17 00:00:00 2001 From: Tobias Bosch Date: Thu, 28 Jan 2016 12:22:04 -0800 Subject: [PATCH] fix(query): update view queries that query directives in embedded views Fixes #6747 --- modules/angular2/src/core/linker/element.ts | 6 +++- .../core/linker/query_integration_spec.ts | 30 ++++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/modules/angular2/src/core/linker/element.ts b/modules/angular2/src/core/linker/element.ts index 7911e35c60..b61ea3a231 100644 --- a/modules/angular2/src/core/linker/element.ts +++ b/modules/angular2/src/core/linker/element.ts @@ -463,7 +463,11 @@ export class AppElement implements DependencyProvider, ElementRef, AfterViewChec var inj: AppElement = this; while (isPresent(inj)) { inj._setQueriesAsDirty(); - inj = inj.parent; + if (isBlank(inj.parent) && isPresent(inj.parentView.containerAppElement)) { + inj = inj.parentView.containerAppElement; + } else { + inj = inj.parent; + } } } diff --git a/modules/angular2/test/core/linker/query_integration_spec.ts b/modules/angular2/test/core/linker/query_integration_spec.ts index 33f64998ae..d2a454127c 100644 --- a/modules/angular2/test/core/linker/query_integration_spec.ts +++ b/modules/angular2/test/core/linker/query_integration_spec.ts @@ -140,6 +140,35 @@ export function main() { }); })); + it('should contain the first view child accross embedded views', + inject([TestComponentBuilder, AsyncTestCompleter], (tcb: TestComponentBuilder, async) => { + var template = ''; + tcb.overrideTemplate(MyComp, template) + .overrideTemplate( + NeedsViewChild, + '
') + .createAsync(MyComp) + .then((view) => { + view.detectChanges(); + var q = view.debugElement.componentViewChildren[0].getLocal('q'); + + expect(q.log).toEqual([["setter", "foo"], ["init", "foo"], ["check", "foo"]]); + + q.shouldShow = false; + view.detectChanges(); + + expect(q.log).toEqual([ + ["setter", "foo"], + ["init", "foo"], + ["check", "foo"], + ["setter", null], + ["check", null] + ]); + + async.done(); + }); + })); + it('should contain all directives in the light dom when descendants flag is used', inject([TestComponentBuilder, AsyncTestCompleter], (tcb: TestComponentBuilder, async) => { var template = '
' + @@ -741,7 +770,6 @@ class NeedsViewChild implements AfterViewInit, ngAfterViewChecked() { this.log.push(["check", isPresent(this.child) ? this.child.text : null]); } } - @Directive({selector: '[dir]'}) @Injectable() class InertDirective {