Skip to content

Commit

Permalink
fix(core): complete EventEmitter in QueryList on component destroy (#…
Browse files Browse the repository at this point in the history
…18902)

Fixes #18741

PR Close #18902
  • Loading branch information
marclaval authored and mhevery committed Sep 1, 2017
1 parent 185a941 commit 36d37cc
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 0 deletions.
6 changes: 6 additions & 0 deletions packages/core/src/linker/query_list.ts
Expand Up @@ -108,6 +108,12 @@ export class QueryList<T>/* implements Iterable<T> */ {

/** internal */
get dirty() { return this._dirty; }

/** internal */
destroy(): void {
this._emitter.complete();
this._emitter.unsubscribe();
}
}

function flatten<T>(list: Array<T|T[]>): T[] {
Expand Down
2 changes: 2 additions & 0 deletions packages/core/src/view/view.ts
Expand Up @@ -530,6 +530,8 @@ function destroyViewNodes(view: ViewData) {
view.renderer.destroyNode !(asElementData(view, i).renderElement);
} else if (def.flags & NodeFlags.TypeText) {
view.renderer.destroyNode !(asTextData(view, i).renderText);
} else if (def.flags & NodeFlags.TypeContentQuery || def.flags & NodeFlags.TypeViewQuery) {
asQueryList(view, i).destroy();
}
}
}
Expand Down
12 changes: 12 additions & 0 deletions packages/core/test/linker/query_integration_spec.ts
Expand Up @@ -10,6 +10,8 @@ import {AfterContentChecked, AfterContentInit, AfterViewChecked, AfterViewInit,
import {ComponentFixture, TestBed, async} from '@angular/core/testing';
import {expect} from '@angular/platform-browser/testing/src/matchers';

import {Subject} from 'rxjs/Subject';

import {stringify} from '../../src/util';

export function main() {
Expand Down Expand Up @@ -348,16 +350,26 @@ export function main() {
view.componentInstance.shouldShow = true;
view.detectChanges();

let isQueryListCompleted = false;

const q: NeedsQuery = view.debugElement.children[0].references !['q'];
const changes = <Subject<any>>q.query.changes;
expect(q.query.length).toEqual(1);
expect(changes.closed).toBeFalsy();
changes.subscribe(() => {}, () => {}, () => { isQueryListCompleted = true; });

view.componentInstance.shouldShow = false;
view.detectChanges();
expect(changes.closed).toBeTruthy();
expect(isQueryListCompleted).toBeTruthy();

view.componentInstance.shouldShow = true;
view.detectChanges();
const q2: NeedsQuery = view.debugElement.children[0].references !['q'];

expect(q2.query.length).toEqual(1);
expect(changes.closed).toBeTruthy();
expect((<Subject<any>>q2.query.changes).closed).toBeFalsy();
});
});

Expand Down

0 comments on commit 36d37cc

Please sign in to comment.