fix(core): complete EventEmitter in QueryList on component destroy (#18902)
Fixes #18741 PR Close #18902
This commit is contained in:
parent
185a941acc
commit
36d37cc6ae
|
@ -108,6 +108,12 @@ export class QueryList<T>/* implements Iterable<T> */ {
|
||||||
|
|
||||||
/** internal */
|
/** internal */
|
||||||
get dirty() { return this._dirty; }
|
get dirty() { return this._dirty; }
|
||||||
|
|
||||||
|
/** internal */
|
||||||
|
destroy(): void {
|
||||||
|
this._emitter.complete();
|
||||||
|
this._emitter.unsubscribe();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function flatten<T>(list: Array<T|T[]>): T[] {
|
function flatten<T>(list: Array<T|T[]>): T[] {
|
||||||
|
|
|
@ -530,6 +530,8 @@ function destroyViewNodes(view: ViewData) {
|
||||||
view.renderer.destroyNode !(asElementData(view, i).renderElement);
|
view.renderer.destroyNode !(asElementData(view, i).renderElement);
|
||||||
} else if (def.flags & NodeFlags.TypeText) {
|
} else if (def.flags & NodeFlags.TypeText) {
|
||||||
view.renderer.destroyNode !(asTextData(view, i).renderText);
|
view.renderer.destroyNode !(asTextData(view, i).renderText);
|
||||||
|
} else if (def.flags & NodeFlags.TypeContentQuery || def.flags & NodeFlags.TypeViewQuery) {
|
||||||
|
asQueryList(view, i).destroy();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,8 @@ import {AfterContentChecked, AfterContentInit, AfterViewChecked, AfterViewInit,
|
||||||
import {ComponentFixture, TestBed, async} from '@angular/core/testing';
|
import {ComponentFixture, TestBed, async} from '@angular/core/testing';
|
||||||
import {expect} from '@angular/platform-browser/testing/src/matchers';
|
import {expect} from '@angular/platform-browser/testing/src/matchers';
|
||||||
|
|
||||||
|
import {Subject} from 'rxjs/Subject';
|
||||||
|
|
||||||
import {stringify} from '../../src/util';
|
import {stringify} from '../../src/util';
|
||||||
|
|
||||||
export function main() {
|
export function main() {
|
||||||
|
@ -348,16 +350,26 @@ export function main() {
|
||||||
view.componentInstance.shouldShow = true;
|
view.componentInstance.shouldShow = true;
|
||||||
view.detectChanges();
|
view.detectChanges();
|
||||||
|
|
||||||
|
let isQueryListCompleted = false;
|
||||||
|
|
||||||
const q: NeedsQuery = view.debugElement.children[0].references !['q'];
|
const q: NeedsQuery = view.debugElement.children[0].references !['q'];
|
||||||
|
const changes = <Subject<any>>q.query.changes;
|
||||||
expect(q.query.length).toEqual(1);
|
expect(q.query.length).toEqual(1);
|
||||||
|
expect(changes.closed).toBeFalsy();
|
||||||
|
changes.subscribe(() => {}, () => {}, () => { isQueryListCompleted = true; });
|
||||||
|
|
||||||
view.componentInstance.shouldShow = false;
|
view.componentInstance.shouldShow = false;
|
||||||
view.detectChanges();
|
view.detectChanges();
|
||||||
|
expect(changes.closed).toBeTruthy();
|
||||||
|
expect(isQueryListCompleted).toBeTruthy();
|
||||||
|
|
||||||
view.componentInstance.shouldShow = true;
|
view.componentInstance.shouldShow = true;
|
||||||
view.detectChanges();
|
view.detectChanges();
|
||||||
const q2: NeedsQuery = view.debugElement.children[0].references !['q'];
|
const q2: NeedsQuery = view.debugElement.children[0].references !['q'];
|
||||||
|
|
||||||
expect(q2.query.length).toEqual(1);
|
expect(q2.query.length).toEqual(1);
|
||||||
|
expect(changes.closed).toBeTruthy();
|
||||||
|
expect((<Subject<any>>q2.query.changes).closed).toBeFalsy();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue