vasan
vasan

Reputation: 2223

How to invoke model events forcefully

I written a function, it will trigger whenever model attribute change just like in the following way.

modelEvents:{
  "change:Name":"callback1"
},
callback1:function(){
  console.log("This is testing");
}

Initially I set model.set("Name","hi") so automatically callback1 was invoked. Again If I set the same value into model, callback1 not triggering because model attribute not modified. so For this every time I am doing in the following.

model.set({"Name":""},{silent:true});
model.set({"Name":"hi"});

If I do like above it's working fine, but I want to know is there any option(like silent) to forcefully invoke callback.

Thanks.

Upvotes: 0

Views: 86

Answers (2)

rcarvalho
rcarvalho

Reputation: 790

Why don't you use Model.hasChanged for this? basically it will listen for changes in an attribute.

Take a look here.

http://backbonejs.org/#Model-hasChanged

Hope it helps

Upvotes: 0

Quince
Quince

Reputation: 14990

If you want to go the route of passing an option then the only way to accomplish this would be to override the set method with something like this in your Model, although i haven't done testing on this to make sure it would not produce unexpected results.

set: function(key, val, options) {
        //call the origonal set so everything works as normal
        Backbone.Model.prototype.set.call(this, key, val, options);
        current = this.attributes, prev = this._previousAttributes;
        if (typeof key === 'object') {
            attrs = key;
            options = val;
        } else {
            (attrs = {})[key] = val;
        }

        options || (options = {});

        //new option to always trigger the change on an attribute
        if (options.loud) {
            for (var key in attrs) {
                //if the value is the same as before trigger the change
                //otherwise backbone will have already triggered the chage
                if (_.isEqual(prev[key] , attrs[key])) {
                    this.trigger('change:' + key, this, current[key], options);
                }
            }
        }
    }

then to make use of it call the normal set but pass loud: true

this.model.set({
            name: "Hi"
        }, {
            loud: true
        });

here a fiddle that makes use of it http://jsfiddle.net/leighking2/ktvj0kgp/ To show that the event is triggered even when the attribute is the same i have added an attribute called renders to show how many times it has been called.

Upvotes: 1

Related Questions