Skip to content
This repository was archived by the owner on May 17, 2018. It is now read-only.

Commit 4cf760f

Browse files
committed
Fix #43 model missing when adding model array to current page under client mode
1 parent 9f68e00 commit 4cf760f

File tree

2 files changed

+32
-10
lines changed

2 files changed

+32
-10
lines changed

lib/backbone-pageable.js

+14-9
Original file line numberDiff line numberDiff line change
@@ -404,29 +404,34 @@
404404
var pageStart = currentPage * pageSize, pageEnd = pageStart + pageSize;
405405

406406
if (event == "add") {
407-
var fullIndex, addAt, colToAdd, options = options || {};
407+
var pageIndex, fullIndex, addAt, colToAdd, options = options || {};
408408
if (collection == fullCol) {
409409
fullIndex = fullCol.indexOf(model);
410410
if (fullIndex >= pageStart && fullIndex < pageEnd) {
411411
colToAdd = pageCol;
412-
addAt = fullIndex - pageStart;
412+
pageIndex = addAt = fullIndex - pageStart;
413413
}
414414
}
415415
else {
416-
fullIndex = pageStart + pageCol.indexOf(model);
416+
pageIndex = pageCol.indexOf(model);
417+
fullIndex = pageStart + pageIndex;
417418
colToAdd = fullCol;
418-
var addAt = options && !_.isUndefined(options.at) ?
419+
var addAt = !_isUndefined(options.at) ?
419420
options.at + pageStart :
420421
fullIndex;
421422
}
422423

423-
424424
++state.totalRecords;
425425
pageCol.state = pageCol._checkState(state);
426426

427427
if (colToAdd) {
428428
colToAdd.add(model, _extend({}, options || {}, {at: addAt}));
429-
if (pageCol.length > pageSize) {
429+
var modelToRemove = pageIndex >= pageSize ?
430+
model :
431+
!_isUndefined(options.at) && addAt < pageEnd && pageCol.length > pageSize ?
432+
pageCol.at(pageSize) :
433+
null;
434+
if (modelToRemove) {
430435
var addHandlers = collection._events.add,
431436
popOptions = {onAdd: true};
432437
if (addHandlers.length) {
@@ -435,14 +440,14 @@
435440
lastAddHandler.callback = function () {
436441
try {
437442
oldCallback.apply(this, arguments);
438-
pageCol.pop(popOptions);
443+
pageCol.remove(modelToRemove, popOptions);
439444
}
440445
finally {
441446
lastAddHandler.callback = oldCallback;
442447
}
443448
};
444449
}
445-
else pageCol.pop(popOptions);
450+
else pageCol.remove(modelToRemove, popOptions);
446451
}
447452
}
448453
}
@@ -923,7 +928,7 @@
923928
if (qs = (qsi = last.indexOf('?')) ? last.slice(qsi + 1) : '') {
924929
var params = queryStringToParams(qs);
925930

926-
var state = _.clone(self.state);
931+
var state = _clone(self.state);
927932
var queryParams = self.queryParams;
928933
var pageSize = state.pageSize;
929934

test/client-pageable.js

+18-1
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ $(document).ready(function () {
122122
strictEqual(col.fullCollection.at(2).get("name"), "c");
123123
});
124124

125-
test("add", 41, function () {
125+
test("add", 49, function () {
126126
var col = new Backbone.PageableCollection(models, {
127127
state: {
128128
pageSize: 2
@@ -190,6 +190,23 @@ $(document).ready(function () {
190190
col.fullCollection.reset();
191191
lastTotalRecords = col.state.totalRecords;
192192
col.add(new Backbone.Model({name: "a"}));
193+
194+
// test ability to add an array of models
195+
col.off("add", onAdd);
196+
col.fullCollection.off("add", onAdd);
197+
col.fullCollection.reset();
198+
col.add([{name: "a"}, {name: "c"}, {name: "b"}]);
199+
strictEqual(col.size(), 2);
200+
strictEqual(col.fullCollection.size(), 3);
201+
deepEqual(col.toJSON(), [{name: "a"}, {name: "c"}]);
202+
deepEqual(col.fullCollection.toJSON(), [{name: "a"}, {name: "c"}, {name: "b"}]);
203+
204+
col.fullCollection.reset();
205+
col.fullCollection.add([{name: "a"}, {name: "c"}, {name: "b"}]);
206+
strictEqual(col.size(), 2);
207+
strictEqual(col.fullCollection.size(), 3);
208+
deepEqual(col.toJSON(), [{name: "a"}, {name: "c"}]);
209+
deepEqual(col.fullCollection.toJSON(), [{name: "a"}, {name: "c"}, {name: "b"}]);
193210
});
194211

195212
test("remove", 46, function () {

0 commit comments

Comments
 (0)