eb1
eb1

Reputation: 2947

TypeError trying to set model object in Backbone.js

I've been playing around with the backbone.js + cordova + require.js frameworks, based mainly off of Cristophe Coenraets' PhoneGap examples on GitHub. Displaying my model in a view seems to be straightforward, but I'm still unable to update the model via calls to set or save.

My model looks something like this:

SourcePhrase = Backbone.Model.extend({
    // default values
    defaults: {
            id: null,
            markers: "",
            orig: null,
            source: "",
            target: ""
    },

    sync: function (method, model, options) {
        if (method === "read") {
            findById(this.id).done(function (data) {
                options.success(data);
            });
        }
    }
}), 
// etc

I can pull objects out of my collection by making a call to get:

// find and update the model object
var strID = $(event.currentTarget.parentElement).attr('id'); 
var model = this.collection.get(strID);

So far, so good:

model.set('target', trimmedValue);

TypeError: 'undefined' is not a function (evaluating '(i=t[r]).callback.call(i.ctx,n,a)')

Hmm...that's not right. Any idea where I need to start looking to track this down?

EDIT: console output for model just before the call to set:

model: Object
_changing: false
_events: Object
_pending: false
_previousAttributes: Object
attributes: Object
id: "RUT001-10"
markers: "\hdr"
orig: null
source: "Ruth"
target: "Ruth"
__proto__: Object
changed: Object
cid: "c15"
collection: Object
id: "RUT001-10"
__proto__: Object
strID: "RUT001-10"

Upvotes: 0

Views: 423

Answers (2)

Rida BENHAMMANE
Rida BENHAMMANE

Reputation: 4129

Yes it's the right method to use, and you can even change your code like this :

this.model.bind('change', this.render, this);

and it will work.

Upvotes: 1

eb1
eb1

Reputation: 2947

Ok, I think I might have tracked it down, maybe? I had in my View for a single item:

initialize: function () {
    this.model.bind('change', this.render());
    this.render();
},

The bind() call was causing the TypeError, which means I might have been running into a "this" issue? (backbone.js and binding "this".) At any rate, I've replaced the block with this one:

initialize: function () {
    this.listenTo(this.model, 'change', this.render);
},

It seems to do the trick. If someone with more backbone.js expertise could comment on this approach, I'd very much appreciate it. Am I doing this correctly?

Upvotes: 0

Related Questions