mirror of
https://github.com/whoisclebs/lodash.git
synced 2026-02-06 17:47:49 +00:00
Update vendors.
Former-commit-id: 4ffc3f5b267f8fdf1ac074f9f9ab44b0a7c4c3dd
This commit is contained in:
102
vendor/backbone/backbone.js
vendored
102
vendor/backbone/backbone.js
vendored
@@ -193,15 +193,12 @@
|
||||
stopListening: function(obj, name, callback) {
|
||||
var listeners = this._listeners;
|
||||
if (!listeners) return this;
|
||||
if (obj) {
|
||||
obj.off(name, typeof name === 'object' ? this : callback, this);
|
||||
if (!name && !callback) delete listeners[obj._listenerId];
|
||||
} else {
|
||||
if (typeof name === 'object') callback = this;
|
||||
for (var id in listeners) {
|
||||
listeners[id].off(name, callback, this);
|
||||
}
|
||||
this._listeners = {};
|
||||
var deleteListener = !name && !callback;
|
||||
if (typeof name === 'object') callback = this;
|
||||
if (obj) (listeners = {})[obj._listenerId] = obj;
|
||||
for (var id in listeners) {
|
||||
listeners[id].off(name, callback, this);
|
||||
if (deleteListener) delete this._listeners[id];
|
||||
}
|
||||
return this;
|
||||
}
|
||||
@@ -216,7 +213,8 @@
|
||||
var listeners = this._listeners || (this._listeners = {});
|
||||
var id = obj._listenerId || (obj._listenerId = _.uniqueId('l'));
|
||||
listeners[id] = obj;
|
||||
obj[implementation](name, typeof name === 'object' ? this : callback, this);
|
||||
if (typeof name === 'object') callback = this;
|
||||
obj[implementation](name, callback, this);
|
||||
return this;
|
||||
};
|
||||
});
|
||||
@@ -420,11 +418,14 @@
|
||||
fetch: function(options) {
|
||||
options = options ? _.clone(options) : {};
|
||||
if (options.parse === void 0) options.parse = true;
|
||||
var model = this;
|
||||
var success = options.success;
|
||||
options.success = function(model, resp, options) {
|
||||
options.success = function(resp) {
|
||||
if (!model.set(model.parse(resp, options), options)) return false;
|
||||
if (success) success(model, resp, options);
|
||||
model.trigger('sync', model, resp, options);
|
||||
};
|
||||
wrapError(this, options);
|
||||
return this.sync('read', this, options);
|
||||
},
|
||||
|
||||
@@ -432,7 +433,7 @@
|
||||
// If the server returns an attributes hash that differs, the model's
|
||||
// state will be `set` again.
|
||||
save: function(key, val, options) {
|
||||
var attrs, success, method, xhr, attributes = this.attributes;
|
||||
var attrs, method, xhr, attributes = this.attributes;
|
||||
|
||||
// Handle both `"key", value` and `{key: value}` -style arguments.
|
||||
if (key == null || typeof key === 'object') {
|
||||
@@ -458,8 +459,9 @@
|
||||
// After a successful server-side save, the client is (optionally)
|
||||
// updated with the server-side state.
|
||||
if (options.parse === void 0) options.parse = true;
|
||||
success = options.success;
|
||||
options.success = function(model, resp, options) {
|
||||
var model = this;
|
||||
var success = options.success;
|
||||
options.success = function(resp) {
|
||||
// Ensure attributes are restored during synchronous saves.
|
||||
model.attributes = attributes;
|
||||
var serverAttrs = model.parse(resp, options);
|
||||
@@ -468,9 +470,10 @@
|
||||
return false;
|
||||
}
|
||||
if (success) success(model, resp, options);
|
||||
model.trigger('sync', model, resp, options);
|
||||
};
|
||||
wrapError(this, options);
|
||||
|
||||
// Finish configuring and sending the Ajax request.
|
||||
method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update');
|
||||
if (method === 'patch') options.attrs = attrs;
|
||||
xhr = this.sync(method, this, options);
|
||||
@@ -493,15 +496,17 @@
|
||||
model.trigger('destroy', model, model.collection, options);
|
||||
};
|
||||
|
||||
options.success = function(model, resp, options) {
|
||||
options.success = function(resp) {
|
||||
if (options.wait || model.isNew()) destroy();
|
||||
if (success) success(model, resp, options);
|
||||
if (!model.isNew()) model.trigger('sync', model, resp, options);
|
||||
};
|
||||
|
||||
if (this.isNew()) {
|
||||
options.success(this, null, options);
|
||||
options.success();
|
||||
return false;
|
||||
}
|
||||
wrapError(this, options);
|
||||
|
||||
var xhr = this.sync('delete', this, options);
|
||||
if (!options.wait) destroy();
|
||||
@@ -602,10 +607,7 @@
|
||||
// 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))) {
|
||||
this.trigger('invalid', this, attrs, options);
|
||||
continue;
|
||||
}
|
||||
if (!(model = this._prepareModel(attrs = models[i], options))) continue;
|
||||
|
||||
// If a duplicate is found, prevent it from being added and
|
||||
// optionally merge it into the existing model.
|
||||
@@ -712,8 +714,7 @@
|
||||
// Get a model from the set by id.
|
||||
get: function(obj) {
|
||||
if (obj == null) return void 0;
|
||||
this._idAttr || (this._idAttr = this.model.prototype.idAttribute);
|
||||
return this._byId[obj.id || obj.cid || obj[this._idAttr] || obj];
|
||||
return this._byId[obj.id || obj.cid || obj];
|
||||
},
|
||||
|
||||
// Get the model at the given index.
|
||||
@@ -721,10 +722,11 @@
|
||||
return this.models[index];
|
||||
},
|
||||
|
||||
// Return models with matching attributes. Useful for simple cases of `filter`.
|
||||
where: function(attrs) {
|
||||
if (_.isEmpty(attrs)) return [];
|
||||
return this.filter(function(model) {
|
||||
// Return models with matching attributes. Useful for simple cases of
|
||||
// `filter`.
|
||||
where: function(attrs, first) {
|
||||
if (_.isEmpty(attrs)) return first ? void 0 : [];
|
||||
return this[first ? 'find' : 'filter'](function(model) {
|
||||
for (var key in attrs) {
|
||||
if (attrs[key] !== model.get(key)) return false;
|
||||
}
|
||||
@@ -732,6 +734,12 @@
|
||||
});
|
||||
},
|
||||
|
||||
// Return the first model with matching attributes. Useful for simple cases
|
||||
// of `find`.
|
||||
findWhere: function(attrs) {
|
||||
return this.where(attrs, true);
|
||||
},
|
||||
|
||||
// Force the collection to re-sort itself. You don't need to call this under
|
||||
// normal circumstances, as the set will maintain sort order as each item
|
||||
// is added.
|
||||
@@ -762,7 +770,7 @@
|
||||
update: function(models, options) {
|
||||
options = _.extend({add: true, merge: true, remove: true}, options);
|
||||
if (options.parse) models = this.parse(models, options);
|
||||
var model, i, l, existing;
|
||||
var attrs, model, i, l, existing;
|
||||
var add = [], remove = [], modelMap = {};
|
||||
|
||||
// Allow a single model (or no argument) to be passed.
|
||||
@@ -773,11 +781,12 @@
|
||||
|
||||
// Determine which models to add and merge, and which to remove.
|
||||
for (i = 0, l = models.length; i < l; i++) {
|
||||
model = models[i];
|
||||
if (!((attrs = models[i]) instanceof Model)) attrs = _.clone(attrs);
|
||||
if (!(model = this._prepareModel(attrs, options))) continue;
|
||||
existing = this.get(model);
|
||||
if (options.remove && existing) modelMap[existing.cid] = true;
|
||||
if ((options.add && !existing) || (options.merge && existing)) {
|
||||
add.push(model);
|
||||
add.push(models[i]);
|
||||
}
|
||||
}
|
||||
if (options.remove) {
|
||||
@@ -816,11 +825,14 @@
|
||||
options = options ? _.clone(options) : {};
|
||||
if (options.parse === void 0) options.parse = true;
|
||||
var success = options.success;
|
||||
options.success = function(collection, resp, options) {
|
||||
var collection = this;
|
||||
options.success = function(resp) {
|
||||
var method = options.update ? 'update' : 'reset';
|
||||
collection[method](resp, options);
|
||||
if (success) success(collection, resp, options);
|
||||
collection.trigger('sync', collection, resp, options);
|
||||
};
|
||||
wrapError(this, options);
|
||||
return this.sync('read', this, options);
|
||||
},
|
||||
|
||||
@@ -833,7 +845,7 @@
|
||||
if (!options.wait) this.add(model, options);
|
||||
var collection = this;
|
||||
var success = options.success;
|
||||
options.success = function(model, resp, options) {
|
||||
options.success = function(resp) {
|
||||
if (options.wait) collection.add(model, options);
|
||||
if (success) success(model, resp, options);
|
||||
};
|
||||
@@ -868,7 +880,10 @@
|
||||
options || (options = {});
|
||||
options.collection = this;
|
||||
var model = new this.model(attrs, options);
|
||||
if (!model._validate(attrs, options)) return false;
|
||||
if (!model._validate(attrs, options)) {
|
||||
this.trigger('invalid', this, attrs, options);
|
||||
return false;
|
||||
}
|
||||
return model;
|
||||
},
|
||||
|
||||
@@ -1432,18 +1447,6 @@
|
||||
params.processData = false;
|
||||
}
|
||||
|
||||
var success = options.success;
|
||||
options.success = function(resp) {
|
||||
if (success) success(model, resp, options);
|
||||
model.trigger('sync', model, resp, options);
|
||||
};
|
||||
|
||||
var error = options.error;
|
||||
options.error = function(xhr) {
|
||||
if (error) error(model, xhr, options);
|
||||
model.trigger('error', model, xhr, options);
|
||||
};
|
||||
|
||||
// Make the request, allowing the user to override any Ajax options.
|
||||
var xhr = options.xhr = Backbone.ajax(_.extend(params, options));
|
||||
model.trigger('request', model, xhr, options);
|
||||
@@ -1502,4 +1505,13 @@
|
||||
throw new Error('A "url" property or function must be specified');
|
||||
};
|
||||
|
||||
// Wrap an optional error callback with a fallback error event.
|
||||
var wrapError = function (model, options) {
|
||||
var error = options.error;
|
||||
options.error = function(resp) {
|
||||
if (error) error(model, resp, options);
|
||||
model.trigger('error', model, resp, options);
|
||||
};
|
||||
};
|
||||
|
||||
}).call(this);
|
||||
|
||||
Reference in New Issue
Block a user