mirror of
https://github.com/jashkenas/backbone.git
synced 2026-04-30 03:00:06 -04:00
model#parse may no longer set the idAttribute
This commit is contained in:
19
backbone.js
19
backbone.js
@@ -112,7 +112,6 @@
|
||||
this._events = {};
|
||||
return this;
|
||||
}
|
||||
|
||||
names = name ? [name] : _.keys(this._events);
|
||||
for (i = 0, l = names.length; i < l; i++) {
|
||||
name = names[i];
|
||||
@@ -252,7 +251,6 @@
|
||||
this.attributes = {};
|
||||
if (options.collection) this.collection = options.collection;
|
||||
if (options.parse) attrs = this.parse(attrs, options) || {};
|
||||
options._attrs || (options._attrs = attrs);
|
||||
if (defaults = _.result(this, 'defaults')) {
|
||||
attrs = _.defaults({}, attrs, defaults);
|
||||
}
|
||||
@@ -667,8 +665,9 @@
|
||||
options = _.defaults({}, options, setOptions);
|
||||
if (options.parse) models = this.parse(models, options);
|
||||
if (!_.isArray(models)) models = models ? [models] : [];
|
||||
var i, l, model, attrs, existing, sort;
|
||||
var i, l, id, model, attrs, existing, sort;
|
||||
var at = options.at;
|
||||
var targetModel = this.model;
|
||||
var sortable = this.comparator && (at == null) && options.sort !== false;
|
||||
var sortAttr = _.isString(this.comparator) ? this.comparator : null;
|
||||
var toAdd = [], toRemove = [], modelMap = {};
|
||||
@@ -678,20 +677,27 @@
|
||||
// Turn bare objects into model references, and prevent invalid models
|
||||
// from being added.
|
||||
for (i = 0, l = models.length; i < l; i++) {
|
||||
if (!(model = this._prepareModel(attrs = models[i], options))) continue;
|
||||
attrs = models[i];
|
||||
if (attrs instanceof Model) {
|
||||
id = model = attrs;
|
||||
} else {
|
||||
id = attrs[targetModel.prototype.idAttribute];
|
||||
}
|
||||
|
||||
// If a duplicate is found, prevent it from being added and
|
||||
// optionally merge it into the existing model.
|
||||
if (existing = this.get(model)) {
|
||||
if (existing = this.get(id)) {
|
||||
if (remove) modelMap[existing.cid] = true;
|
||||
if (merge) {
|
||||
attrs = attrs === model ? model.attributes : options._attrs;
|
||||
attrs = attrs === model ? model.attributes : attrs;
|
||||
if (options.parse) attrs = existing.parse(attrs, options);
|
||||
existing.set(attrs, options);
|
||||
if (sortable && !sort && existing.hasChanged(sortAttr)) sort = true;
|
||||
}
|
||||
|
||||
// This is a new model, push it to the `toAdd` list.
|
||||
} else if (add) {
|
||||
if (!(model = this._prepareModel(attrs, options))) continue;
|
||||
toAdd.push(model);
|
||||
|
||||
// Listen to added models' events, and index models for lookup by
|
||||
@@ -701,7 +707,6 @@
|
||||
if (model.id != null) this._byId[model.id] = model;
|
||||
}
|
||||
if (order) order.push(existing || model);
|
||||
delete options._attrs;
|
||||
}
|
||||
|
||||
// Remove nonexistent models if appropriate.
|
||||
|
||||
@@ -225,13 +225,13 @@ $(document).ready(function() {
|
||||
});
|
||||
|
||||
test("add with parse and merge", function() {
|
||||
var Model = Backbone.Model.extend({
|
||||
parse: function (data) {
|
||||
return data.model;
|
||||
}
|
||||
});
|
||||
var collection = new Backbone.Collection();
|
||||
collection.model = Model;
|
||||
collection.parse = function(attrs) {
|
||||
return _.map(attrs, function(model) {
|
||||
if (model.model) return model.model;
|
||||
return model;
|
||||
});
|
||||
};
|
||||
collection.add({id: 1});
|
||||
collection.add({model: {id: 1, name: 'Alf'}}, {parse: true, merge: true});
|
||||
equal(collection.first().get('name'), 'Alf');
|
||||
@@ -975,12 +975,10 @@ $(document).ready(function() {
|
||||
});
|
||||
|
||||
test("`set` and model level `parse`", function() {
|
||||
var Model = Backbone.Model.extend({
|
||||
parse: function (res) { return res.model; }
|
||||
});
|
||||
var Model = Backbone.Model.extend({});
|
||||
var Collection = Backbone.Collection.extend({
|
||||
model: Model,
|
||||
parse: function (res) { return res.models; }
|
||||
parse: function (res) { return _.pluck(res.models, 'model'); }
|
||||
});
|
||||
var model = new Model({id: 1});
|
||||
var collection = new Collection(model);
|
||||
|
||||
Reference in New Issue
Block a user