perf(virtual-scroll): fast path for removing

This commit is contained in:
Manu Mtz.-Almeida
2017-04-23 16:00:04 +02:00
committed by Manuel Mtz-Almeida
parent 88e5642f60
commit 8baa6474a4
2 changed files with 22 additions and 16 deletions

View File

@ -44,18 +44,19 @@ export class E2EPage {
addRandomItem() { addRandomItem() {
const index = Math.floor(Math.random() * this.items.length); const index = Math.floor(Math.random() * this.items.length);
console.log('Adding to index: ', index);
this.items.splice( index, 0, { this.items.splice( index, 0, {
value: Math.floor(Math.random() * 10000), value: Math.floor(Math.random() * 10000),
someMethod: function() { someMethod: function() {
return '!!'; return '!!';
} }
} });
);
} }
changeItem() { changeItem() {
const index = Math.floor(Math.random() * this.items.length); const index = Math.floor(Math.random() * this.items.length);
this.items[index].value = Math.floor(Math.random() * 10000); console.log('Change to index: ', index);
this.items[index] = { value: Math.floor(Math.random() * 10000), someMethod: () => '!!' };
} }
trackByFn(index: number, item: any) { trackByFn(index: number, item: any) {

View File

@ -233,7 +233,8 @@ export class VirtualScroll implements DoCheck, AfterContentInit, OnDestroy {
scrollTop: 0, scrollTop: 0,
}; };
_queue: number = SCROLL_QUEUE_NO_CHANGES; _queue: number = SCROLL_QUEUE_NO_CHANGES;
_recordSize: number = 0;
_virtualTrackBy: TrackByFn; _virtualTrackBy: TrackByFn;
@ContentChild(VirtualItem) _itmTmp: VirtualItem; @ContentChild(VirtualItem) _itmTmp: VirtualItem;
@ -416,10 +417,7 @@ export class VirtualScroll implements DoCheck, AfterContentInit, OnDestroy {
*/ */
firstRecord(): number { firstRecord(): number {
const cells = this._cells; const cells = this._cells;
if (cells.length > 0) { return (cells.length > 0) ? cells[0].record : 0;
return cells[0].record;
}
return 0;
} }
/** /**
@ -427,10 +425,7 @@ export class VirtualScroll implements DoCheck, AfterContentInit, OnDestroy {
*/ */
lastRecord(): number { lastRecord(): number {
const cells = this._cells; const cells = this._cells;
if (cells.length > 0) { return (cells.length > 0) ? cells[cells.length - 1].record : 0;
return cells[cells.length - 1].record;
}
return 0;
} }
/** /**
@ -451,15 +446,25 @@ export class VirtualScroll implements DoCheck, AfterContentInit, OnDestroy {
let needClean = false; let needClean = false;
if (changes) { if (changes) {
var lastRecord = this.lastRecord() + 1; var lastRecord = this.lastRecord() + 1;
changes.forEachOperation((item, _, cindex) => {
if (item.previousIndex != null || (cindex < lastRecord)) { changes.forEachOperation((_, pindex, cindex) => {
// add new record after current position
if (pindex === null && (cindex < lastRecord)) {
console.debug('adding record before current position, slow path');
needClean = true; needClean = true;
return;
}
// remove record after current position
if (pindex < lastRecord && cindex === null) {
console.debug('removing record before current position, slow path');
needClean = true;
return;
} }
}); });
} else { } else {
needClean = true; needClean = true;
} }
this._recordSize = this._records.length;
this.readUpdate(needClean); this.readUpdate(needClean);
this.writeUpdate(needClean); this.writeUpdate(needClean);
@ -555,7 +560,7 @@ export class VirtualScroll implements DoCheck, AfterContentInit, OnDestroy {
this._itmTmp.viewContainer, this._itmTmp.viewContainer,
this._itmTmp.templateRef, this._itmTmp.templateRef,
this._hdrTmp && this._hdrTmp.templateRef, this._hdrTmp && this._hdrTmp.templateRef,
this._ftrTmp && this._ftrTmp.templateRef, needClean, this._ftrTmp && this._ftrTmp.templateRef, needClean
); );
}); });