mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2025-08-21 04:53:58 +08:00
fix(VirtualScroll): initialise differ with trackByFn (#11492)
* fix(VirtualScroll): initialise differ with trackByFn * fix(VirtualScroll): DRY up differ initialization
This commit is contained in:

committed by
Manu MA

parent
646d736d07
commit
299a68bcdc
@ -58,6 +58,10 @@ export class E2EPage {
|
|||||||
window.location.reload(true);
|
window.location.reload(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
trackByFn(index: number, item: any) {
|
||||||
|
return item.value;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,15 +19,16 @@
|
|||||||
<button ion-button (click)="pushPage()">Push Virtual Scroll Page</button>
|
<button ion-button (click)="pushPage()">Push Virtual Scroll Page</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<ion-list [virtualScroll]="items"
|
|
||||||
[headerFn]="headerFn">
|
<ion-list [virtualScroll]="items" [headerFn]="headerFn" [virtualTrackBy]="trackByFn"
|
||||||
|
approxItemHeight="46px">
|
||||||
|
|
||||||
<ion-item-divider *virtualHeader="let header">
|
<ion-item-divider *virtualHeader="let header">
|
||||||
Header: {{header}}
|
Header: {{ header }}
|
||||||
</ion-item-divider>
|
</ion-item-divider>
|
||||||
|
|
||||||
<ion-item *virtualItem="let item">
|
<ion-item *virtualItem="let item">
|
||||||
Item: {{item.value}} {{item.someMethod()}}
|
Item: {{ item.value }} {{ item.someMethod() }}
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
||||||
</ion-list>
|
</ion-list>
|
||||||
|
@ -234,6 +234,7 @@ export class VirtualScroll implements DoCheck, AfterContentInit, OnDestroy {
|
|||||||
};
|
};
|
||||||
_queue: number = SCROLL_QUEUE_NO_CHANGES;
|
_queue: number = SCROLL_QUEUE_NO_CHANGES;
|
||||||
_recordSize: number = 0;
|
_recordSize: number = 0;
|
||||||
|
_virtualTrackBy: TrackByFn;
|
||||||
|
|
||||||
@ContentChild(VirtualItem) _itmTmp: VirtualItem;
|
@ContentChild(VirtualItem) _itmTmp: VirtualItem;
|
||||||
@ContentChild(VirtualHeader) _hdrTmp: VirtualHeader;
|
@ContentChild(VirtualHeader) _hdrTmp: VirtualHeader;
|
||||||
@ -249,9 +250,7 @@ export class VirtualScroll implements DoCheck, AfterContentInit, OnDestroy {
|
|||||||
@Input()
|
@Input()
|
||||||
set virtualScroll(val: any) {
|
set virtualScroll(val: any) {
|
||||||
this._records = val;
|
this._records = val;
|
||||||
if (isBlank(this._differ) && isPresent(val)) {
|
this._updateDiffer();
|
||||||
this._differ = this._iterableDiffers.find(val).create(this.virtualTrackBy);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -368,7 +367,12 @@ export class VirtualScroll implements DoCheck, AfterContentInit, OnDestroy {
|
|||||||
/**
|
/**
|
||||||
* @input {function} Same as `ngForTrackBy` which can be used on `ngFor`.
|
* @input {function} Same as `ngForTrackBy` which can be used on `ngFor`.
|
||||||
*/
|
*/
|
||||||
@Input() virtualTrackBy: TrackByFn;
|
@Input()
|
||||||
|
set virtualTrackBy(val: TrackByFn) {
|
||||||
|
if (!isPresent(val)) return;
|
||||||
|
this._virtualTrackBy = val;
|
||||||
|
this._updateDiffer();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@ -481,6 +485,12 @@ export class VirtualScroll implements DoCheck, AfterContentInit, OnDestroy {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private _updateDiffer(): void {
|
||||||
|
if (isBlank(this._differ) && isPresent(this._records)) {
|
||||||
|
this._differ = this._iterableDiffers.find(this._records).create(this.virtualTrackBy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @hidden
|
* @hidden
|
||||||
* DOM WRITE
|
* DOM WRITE
|
||||||
|
Reference in New Issue
Block a user