Amateur
Amateur

Reputation: 81

How to update attribute of an existing model?

I wanted to update the rank attribute of an existing model which I passed from another view. However, I get the error Uncaught TypeError: Object # has no method 'set'.

In the initialize part of the view, I have :

this.collection = new tgcollection({model : this.options.model });

I define a function updateModel intended to update the attribute value as:

updateModel: function(){
    var val= $("#textbox_id").val();
console.log(val);   
console.log(JSON.stringify(this.options.model));
JSON.stringify(this.options.model);
this.options.model.set({"rank": val});
this.render();
//
},

Where am I going wrong? I can see the value and the model with its previous attribute values in the console.

The model:

define(['jquery','underscore', 'backbone', 'deepmodel'], 
       function($,_, Backbone) {
         var model = Backbone.DeepModel.extend({

        // Default attributes for the model.
        defaults : {
            id: null,
                rank: null,

        },

        initialize: function(){
            _.bindAll(this,"update");
                    this.bind('change : cost', this.update);
        },

        update: function(){
            console.log(this.get("cost"));

        },
        // Remove this model from *localStorage*.
        clear : function() {
            this.destroy();
        },

    });
    return model;

});

Upvotes: 4

Views: 19761

Answers (2)

schacki
schacki

Reputation: 9533

Just do

this.model.set({"rank": val});

instead of

this.options.model.set({"rank": val});

The model within a view is accessed via this.model not this.options.model

Upvotes: 11

jmk2142
jmk2142

Reputation: 8581

I love a good mystery. Here is my best guess based on what I see. The problem is probably even further back. Where you call:

this.collection = new tgcollection({model : this.options.model });

this.options.model is probably not what you think it is. It would be helpful to see the view BEFORE this view that is instantiating and passing in this.options.model. BTW, with models and collections passed into the view, you can always shorten it to this.model Model, Collection and a handful of others are special in that they get attached directly to the View once passed in.

I'm assuming that in your updateModel() the following SEEM to work:

console.log(JSON.stringify(this.options.model));
JSON.stringify(this.options.model);

The error is coming up on the set(), not the lines above. So the assumption is that you passed in a model. Or did you? My wild guess is that what this.options.model actually is, is just a json object of your model. This might explain why you "see" the model in your console when you stringify it, but then Backbone protests when you call set() on it.

Instead of JSON.stringify to test this.options.model try just console.log(this.options.model). Well, you don't have to test really. The fact that Backbone can't find set() on this object is a tell tale sign. If you're not seeing the complexity of a Backbone model in your console - it's not a model.

Also, for testing and debugging particularly models, I tend to use the model.toJSON() function as a quick check that it's a model and I'm seeing attributes I expect.

Let us know if you have more clues.

Upvotes: 0

Related Questions