82 lines
2.7 KiB
JavaScript
82 lines
2.7 KiB
JavaScript
var $ = require('jquery');
|
|
var _ = require('underscore');
|
|
var Backbone = require('backbone');
|
|
|
|
/**
|
|
* Base Model for all CartoDB model.
|
|
* DO NOT USE Backbone.Model directly
|
|
*/
|
|
var Model = Backbone.Model.extend({
|
|
|
|
initialize: function (options) {
|
|
_.bindAll(this, 'fetch', 'save', 'retrigger');
|
|
return Backbone.Model.prototype.initialize.call(this, options);
|
|
},
|
|
/**
|
|
* We are redefining fetch to be able to trigger an event when the ajax call ends, no matter if there's
|
|
* a change in the data or not. Why don't backbone does this by default? ahh, my friend, who knows.
|
|
* @method fetch
|
|
* @param args {Object}
|
|
*/
|
|
fetch: function (args) {
|
|
var self = this;
|
|
// var date = new Date();
|
|
this.trigger('loadModelStarted');
|
|
$.when(Backbone.Model.prototype.fetch.call(this, args)).done(function (ev) {
|
|
self.trigger('loadModelCompleted', ev, self);
|
|
// var dateComplete = new Date()
|
|
// console.log('completed in '+(dateComplete - date));
|
|
}).fail(function (ev) {
|
|
self.trigger('loadModelFailed', ev, self);
|
|
});
|
|
},
|
|
/**
|
|
* Changes the attribute used as Id
|
|
* @method setIdAttribute
|
|
* @param attr {String}
|
|
*/
|
|
setIdAttribute: function (attr) {
|
|
this.idAttribute = attr;
|
|
},
|
|
/**
|
|
* Listen for an event on another object and triggers on itself, with the same name or a new one
|
|
* @method retrigger
|
|
* @param ev {String} event who triggers the action
|
|
* @param obj {Object} object where the event happens
|
|
* @param obj {Object} [optional] name of the retriggered event
|
|
* @todo [xabel]: This method is repeated here and in the base view definition. There's should be a way to make it unique
|
|
*/
|
|
retrigger: function (ev, obj, retrigEvent) {
|
|
if (!retrigEvent) {
|
|
retrigEvent = ev;
|
|
}
|
|
var self = this;
|
|
obj.bind && obj.bind(ev, function () {
|
|
self.trigger(retrigEvent);
|
|
}, self);
|
|
},
|
|
|
|
/**
|
|
* We need to override backbone save method to be able to introduce new kind of triggers that
|
|
* for some reason are not present in the original library. Because you know, it would be nice
|
|
* to be able to differenciate "a model has been updated" of "a model is being saved".
|
|
* TODO: remove jquery from here
|
|
* @param {object} opt1
|
|
* @param {object} opt2
|
|
* @return {$.Deferred}
|
|
*/
|
|
save: function (opt1, opt2) {
|
|
var self = this;
|
|
if (!opt2 || !opt2.silent) this.trigger('saving');
|
|
var promise = Backbone.Model.prototype.save.apply(this, arguments);
|
|
$.when(promise).done(function () {
|
|
if (!opt2 || !opt2.silent) self.trigger('saved');
|
|
}).fail(function () {
|
|
if (!opt2 || !opt2.silent) self.trigger('errorSaving');
|
|
});
|
|
return promise;
|
|
}
|
|
});
|
|
|
|
module.exports = Model;
|