parent
b10540a0b5
commit
285dd6be34
|
@ -10,6 +10,7 @@
|
||||||
// correctly implementing its interfaces for backwards compatibility.
|
// correctly implementing its interfaces for backwards compatibility.
|
||||||
import {Observable} from 'rxjs/Observable';
|
import {Observable} from 'rxjs/Observable';
|
||||||
|
|
||||||
|
import {EventEmitter} from '../event_emitter';
|
||||||
import {QueryList as viewEngine_QueryList} from '../linker/query_list';
|
import {QueryList as viewEngine_QueryList} from '../linker/query_list';
|
||||||
import {Type} from '../type';
|
import {Type} from '../type';
|
||||||
import {getSymbolIterator} from '../util';
|
import {getSymbolIterator} from '../util';
|
||||||
|
@ -295,7 +296,7 @@ function createPredicate<T>(
|
||||||
|
|
||||||
class QueryList_<T>/* implements viewEngine_QueryList<T> */ {
|
class QueryList_<T>/* implements viewEngine_QueryList<T> */ {
|
||||||
readonly dirty = true;
|
readonly dirty = true;
|
||||||
readonly changes: Observable<T>;
|
readonly changes: Observable<T> = new EventEmitter();
|
||||||
private _values: T[] = [];
|
private _values: T[] = [];
|
||||||
/** @internal */
|
/** @internal */
|
||||||
_valuesTree: any[] = [];
|
_valuesTree: any[] = [];
|
||||||
|
@ -367,9 +368,12 @@ class QueryList_<T>/* implements viewEngine_QueryList<T> */ {
|
||||||
(this as{dirty: boolean}).dirty = false;
|
(this as{dirty: boolean}).dirty = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
notifyOnChanges(): void { throw new Error('Method not implemented.'); }
|
notifyOnChanges(): void { (this.changes as EventEmitter<any>).emit(this); }
|
||||||
setDirty(): void { (this as{dirty: boolean}).dirty = true; }
|
setDirty(): void { (this as{dirty: boolean}).dirty = true; }
|
||||||
destroy(): void { throw new Error('Method not implemented.'); }
|
destroy(): void {
|
||||||
|
(this.changes as EventEmitter<any>).complete();
|
||||||
|
(this.changes as EventEmitter<any>).unsubscribe();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: this hack is here because IQueryList has private members and therefore
|
// NOTE: this hack is here because IQueryList has private members and therefore
|
||||||
|
@ -396,6 +400,7 @@ export function queryRefresh(query: QueryList<any>): boolean {
|
||||||
const queryImpl = (query as any as QueryList_<any>);
|
const queryImpl = (query as any as QueryList_<any>);
|
||||||
if (query.dirty) {
|
if (query.dirty) {
|
||||||
query.reset(queryImpl._valuesTree);
|
query.reset(queryImpl._valuesTree);
|
||||||
|
query.notifyOnChanges();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -826,4 +826,34 @@ describe('query', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('observable interface', () => {
|
||||||
|
|
||||||
|
it('should allow observing changes to query list', () => {
|
||||||
|
const queryList = new QueryList();
|
||||||
|
let changes = 0;
|
||||||
|
|
||||||
|
queryList.changes.subscribe({
|
||||||
|
next: (arg) => {
|
||||||
|
changes += 1;
|
||||||
|
expect(arg).toBe(queryList);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// initial refresh, the query should be dirty
|
||||||
|
qR(queryList);
|
||||||
|
expect(changes).toBe(1);
|
||||||
|
|
||||||
|
|
||||||
|
// refresh without setting dirty - no emit
|
||||||
|
qR(queryList);
|
||||||
|
expect(changes).toBe(1);
|
||||||
|
|
||||||
|
// refresh with setting dirty - emit
|
||||||
|
queryList.setDirty();
|
||||||
|
qR(queryList);
|
||||||
|
expect(changes).toBe(2);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue