emit remove before linking up sibling tiles
otherwise emitting the update from updatePreviousSibling has the wrong idx
This commit is contained in:
parent
63b371b6ef
commit
0596ca06b1
2 changed files with 34 additions and 2 deletions
|
@ -195,11 +195,14 @@ export class TilesCollection extends BaseObservableList {
|
||||||
_removeTile(tileIdx, tile) {
|
_removeTile(tileIdx, tile) {
|
||||||
const prevTile = this._getTileAtIdx(tileIdx - 1);
|
const prevTile = this._getTileAtIdx(tileIdx - 1);
|
||||||
const nextTile = this._getTileAtIdx(tileIdx + 1);
|
const nextTile = this._getTileAtIdx(tileIdx + 1);
|
||||||
|
// applying and emitting the remove should happen
|
||||||
|
// atomically, as updateNext/PreviousSibling might
|
||||||
|
// emit an update with the wrong index otherwise
|
||||||
this._tiles.splice(tileIdx, 1);
|
this._tiles.splice(tileIdx, 1);
|
||||||
prevTile && prevTile.updateNextSibling(nextTile);
|
|
||||||
nextTile && nextTile.updatePreviousSibling(prevTile);
|
|
||||||
tile.dispose();
|
tile.dispose();
|
||||||
this.emitRemove(tileIdx, tile);
|
this.emitRemove(tileIdx, tile);
|
||||||
|
prevTile?.updateNextSibling(nextTile);
|
||||||
|
nextTile?.updatePreviousSibling(prevTile);
|
||||||
}
|
}
|
||||||
|
|
||||||
// would also be called when unloading a part of the timeline
|
// would also be called when unloading a part of the timeline
|
||||||
|
@ -301,5 +304,29 @@ export function tests() {
|
||||||
entries.insert(1, {n: 7});
|
entries.insert(1, {n: 7});
|
||||||
assert(receivedAdd);
|
assert(receivedAdd);
|
||||||
},
|
},
|
||||||
|
"emit update with correct index in updatePreviousSibling during remove": assert => {
|
||||||
|
class UpdateOnSiblingTile extends TestTile {
|
||||||
|
updatePreviousSibling() {
|
||||||
|
this.update?.(this, "previous");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const entries = new ObservableArray([{n: 5}, {n: 10}, {n: 15}]);
|
||||||
|
const tiles = new TilesCollection(entries, entry => new UpdateOnSiblingTile(entry));
|
||||||
|
const events = [];
|
||||||
|
tiles.subscribe({
|
||||||
|
onUpdate(idx, tile) {
|
||||||
|
assert.equal(idx, 1);
|
||||||
|
assert.equal(tile.entry.n, 15);
|
||||||
|
events.push("update");
|
||||||
|
},
|
||||||
|
onRemove(idx, tile) {
|
||||||
|
assert.equal(idx, 1);
|
||||||
|
assert.equal(tile.entry.n, 10);
|
||||||
|
events.push("remove");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
entries.remove(1);
|
||||||
|
assert.deepEqual(events, ["remove", "update"]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,11 @@ export class ObservableArray extends BaseObservableList {
|
||||||
this.emitAdd(this._items.length - 1, item);
|
this.emitAdd(this._items.length - 1, item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
remove(idx) {
|
||||||
|
const [item] = this._items.splice(idx, 1);
|
||||||
|
this.emitRemove(idx, item);
|
||||||
|
}
|
||||||
|
|
||||||
insertMany(idx, items) {
|
insertMany(idx, items) {
|
||||||
for(let item of items) {
|
for(let item of items) {
|
||||||
this.insert(idx, item);
|
this.insert(idx, item);
|
||||||
|
|
Reference in a new issue