Files
carto.js/src/core/model.js
2020-06-13 18:34:34 +08:00

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;