Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Truly change a model attribute silently in Backbone.js?

Tags:

backbone.js

Is there a way I can change attributes on a model without ever firing a change event? If you pass {"silent":true} right now, the next time an attribute is changed, the silent change event will be triggered. Can I change an attribute safely without the change event ever being triggered?

from change, Backbone 0.9.2:

// Silent changes become pending changes.
for (var attr in this._silent) this._pending[attr] = true;

// Silent changes are triggered.
var changes = _.extend({}, options.changes, this._silent);
this._silent = {};
for (var attr in changes) {
    this.trigger('change:' + attr, this, this.get(attr), options);
like image 203
stinkycheeseman Avatar asked Dec 05 '22 17:12

stinkycheeseman


2 Answers

You can change model attributes directly using model.attributes['xyz'] = 123.

like image 144
abraham Avatar answered Dec 21 '22 23:12

abraham


I think the cleanest way if you really want to default to silent (but still be able to do silent:false) sets would be to override set. This should do it:

var SilentModel = Backbone.Model.extend({

    set: function(attrs, options) {
        options = options || {};
        if (!('silent' in options)) {
            options.silent = true;
        }
        return Backbone.Model.prototype.set.call(this, attrs, options);
    }
});
like image 45
ggozad Avatar answered Dec 22 '22 00:12

ggozad