diff --git a/docs/data/dataset.html b/docs/data/dataset.html index 3f90ead4..af0f2b4d 100644 --- a/docs/data/dataset.html +++ b/docs/data/dataset.html @@ -598,9 +598,11 @@ function (event, properties, senderId) { update, and remove, properties is always an object containing a property items, which contains an array with the ids of the affected - items. The update event has an extra field oldData - containing the original data of the updated items, and a field data - containing the changes: the properties of the items that are being updated. + items. The update and remove events have an extra + field oldData containing the original data of the items in the + dataset before the items were updated or removed. The update + event also contains a field data containing the changes: + the properties of the items that are being updated. diff --git a/lib/DataSet.js b/lib/DataSet.js index fbc6b92a..8f3b910f 100644 --- a/lib/DataSet.js +++ b/lib/DataSet.js @@ -668,25 +668,26 @@ DataSet.prototype._sort = function (items, order) { */ DataSet.prototype.remove = function (id, senderId) { var removedIds = [], - i, len, removedId; - - if (Array.isArray(id)) { - for (i = 0, len = id.length; i < len; i++) { - removedId = this._remove(id[i]); - if (removedId != null) { - removedIds.push(removedId); + removedItems = [], + ids = [], + i, len, itemId, item; + + // force everything to be an array for simplicity + ids = Array.isArray(id) ? id : [id]; + + for (i = 0, len = ids.length; i < len; i++) { + item = this._remove(ids[i]); + if (item) { + itemId = item[this._fieldId]; + if (itemId) { + removedIds.push(itemId); + removedItems.push(item); } } } - else { - removedId = this._remove(id); - if (removedId != null) { - removedIds.push(removedId); - } - } if (removedIds.length) { - this._trigger('remove', {items: removedIds}, senderId); + this._trigger('remove', {items: removedIds, oldData: removedItems}, senderId); } return removedIds; @@ -699,20 +700,23 @@ DataSet.prototype.remove = function (id, senderId) { * @private */ DataSet.prototype._remove = function (id) { + var item, + ident; + + // confirm the id to use based on the args type if (util.isNumber(id) || util.isString(id)) { - if (this._data[id]) { - delete this._data[id]; - this.length--; - return id; - } + ident = id; } else if (id instanceof Object) { - var itemId = id[this._fieldId]; - if (itemId !== undefined && this._data[itemId]) { - delete this._data[itemId]; - this.length--; - return itemId; - } + ident = id[this._fieldId]; // look for the identifier field using _fieldId + } + + // do the remove if the item is found + if (ident !== undefined && this._data[ident]) { + item = this._data[ident]; + delete this._data[ident]; + this.length--; + return item; } return null; }; @@ -723,12 +727,18 @@ DataSet.prototype._remove = function (id) { * @return {Array} removedIds The ids of all removed items */ DataSet.prototype.clear = function (senderId) { + var i, len; var ids = Object.keys(this._data); + var items = []; + + for (i = 0, len = ids.length; i < len; i++) { + items.push(this._data[ids[i]]); + } this._data = {}; this.length = 0; - this._trigger('remove', {items: ids}, senderId); + this._trigger('remove', {items: ids, oldData: items}, senderId); return ids; }; diff --git a/lib/DataView.js b/lib/DataView.js index ba7a864e..5a844cff 100644 --- a/lib/DataView.js +++ b/lib/DataView.js @@ -35,7 +35,7 @@ function DataView (data, options) { * @param {DataSet | DataView} data */ DataView.prototype.setData = function (data) { - var ids, id, i, len; + var ids, id, i, len, items; if (this._data) { // unsubscribe from current dataset @@ -44,10 +44,16 @@ DataView.prototype.setData = function (data) { } // trigger a remove of all items in memory - ids = Object.keys(this._ids); + ids = this._data.getIds({filter: this._options && this._options.filter}); + items = []; + + for (i = 0, len = ids.length; i < len; i++) { + items.push(this._data._data[ids[i]]); + } + this._ids = {}; this.length = 0; - this._trigger('remove', {items: ids}); + this._trigger('remove', {items: ids, oldData: items}); } this._data = data; @@ -80,18 +86,19 @@ DataView.prototype.setData = function (data) { */ DataView.prototype.refresh = function () { var id, i, len; - var ids = this._data.getIds({filter: this._options && this._options.filter}); - var oldIds = Object.keys(this._ids); - var newIds = {}; - var added = []; - var removed = []; + var ids = this._data.getIds({filter: this._options && this._options.filter}), + oldIds = Object.keys(this._ids), + newIds = {}, + addedIds = [], + removedIds = [], + removedItems = []; // check for additions for (i = 0, len = ids.length; i < len; i++) { id = ids[i]; newIds[id] = true; if (!this._ids[id]) { - added.push(id); + addedIds.push(id); this._ids[id] = true; } } @@ -100,19 +107,20 @@ DataView.prototype.refresh = function () { for (i = 0, len = oldIds.length; i < len; i++) { id = oldIds[i]; if (!newIds[id]) { - removed.push(id); + removedIds.push(id); + removedItems.push(this._data[id]); delete this._ids[id]; } } - this.length += added.length - removed.length; + this.length += addedIds.length - removedIds.length; // trigger events - if (added.length) { + if (addedIds.length) { this._trigger('add', {items: added}); } - if (removed.length) { - this._trigger('remove', {items: removed}); + if (removedIds.length) { + this._trigger('remove', {items: removedIds, oldData: removedItems}); } }; @@ -298,14 +306,14 @@ DataView.prototype.getDataSet = function () { DataView.prototype._onEvent = function (event, params, senderId) { var i, len, id, item; var ids = params && params.items; - var data = this._data; - var updatedData = []; - var oldData = []; - var added = []; - var updated = []; - var removed = []; - - if (ids && data) { + var addedIds = [], + updatedIds = [], + removedIds = [], + oldItems = [], + updatedItems = [], + removedItems = []; + + if (ids && this._data) { switch (event) { case 'add': // filter the ids of the added items @@ -314,7 +322,7 @@ DataView.prototype._onEvent = function (event, params, senderId) { item = this.get(id); if (item) { this._ids[id] = true; - added.push(id); + addedIds.push(id); } } @@ -329,19 +337,20 @@ DataView.prototype._onEvent = function (event, params, senderId) { if (item) { if (this._ids[id]) { - updated.push(id); - updatedData.push(params.data[i]); - oldData.push(params.oldData[i]); + updatedIds.push(id); + updatedItems.push(params.data[i]); + oldItems.push(params.oldData[i]); } else { this._ids[id] = true; - added.push(id); + addedIds.push(id); } } else { if (this._ids[id]) { delete this._ids[id]; - removed.push(id); + removedIds.push(id); + removedItems.push(params.oldData[i]); } else { // nothing interesting for me :-( @@ -357,23 +366,24 @@ DataView.prototype._onEvent = function (event, params, senderId) { id = ids[i]; if (this._ids[id]) { delete this._ids[id]; - removed.push(id); + removedIds.push(id); + removedItems.push(params.oldData[i]); } } break; } - this.length += added.length - removed.length; + this.length += addedIds.length - removedIds.length; - if (added.length) { - this._trigger('add', {items: added}, senderId); + if (addedIds.length) { + this._trigger('add', {items: addedIds}, senderId); } - if (updated.length) { - this._trigger('update', {items: updated, oldData: oldData, data: updatedData}, senderId); + if (updatedIds.length) { + this._trigger('update', {items: updatedIds, oldData: oldItems, data: updatedItems}, senderId); } - if (removed.length) { - this._trigger('remove', {items: removed}, senderId); + if (removedIds.length) { + this._trigger('remove', {items: removedIds, oldData: removedItems}, senderId); } } };