Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

getting model data to a view backbone.js

I am trying to understand the relationship between a model and a view. I've tried building a model and view to render that model.

I get the error Cannot call method 'toJSON' of undefined which I understand as the actual instance of the model is not being sent to the view.

I feel there is something missing in the initialize of the view?

The Model:

var sticky = Backbone.Model.extend({

defaults: {
    title:"",
    content:"",
    created: new Date()

},

initialize: function() {
    console.log("sticky created!");

}

}); 

The View:

var stickyView = Backbone.View.extend({

tagName:"div",
className:"sticky-container",

initialize: function() {
    this.render();
    console.log("stickyView created!");
},

render: function() {
    $("#content-view").prepend(this.el);
    var data = this.model.toJSON(); // Error: Cannot call method 'toJSON' of undefined 
    console.log(data);
    var source = $("#sticky-template").html();
    var template = Handlebars.compile(source);
    $(this.el).html(template(data));
    return this;
}

});

Creating new model and new instance of the view:

var Sticky = new sticky({title:"test"});

var StickyView = new stickyView();
like image 240
salmoally Avatar asked May 11 '13 15:05

salmoally


1 Answers

You have to pass your model instance to your view, Backbone will do the rest:

constructor / initialize new View([options])
There are several special options that, if passed, will be attached directly to the view: model, collection, el, id, className, tagName and attributes.

which means you would create your view like this

var StickyView = new stickyView({model: Sticky});

And while you're at it, you could pass your compiled template and the DOM node you wish to set as your view element (and remove the tagName and className from your view definition) to avoid a strict coupling:

var stickyView = Backbone.View.extend({

    initialize: function(opts) {
        this.template = opts.template;
        this.render();
        console.log("stickyView created!");
    },

    render: function() {
        var data = this.model.toJSON();
        console.log(data);

        this.$el.html(this.template(data));

        return this;
    }

});

var StickyView = new stickyView({
    model: Sticky, 
    el: '#content-view',
    template: Handlebars.compile($("#sticky-template").html())
});
like image 185
nikoshr Avatar answered Nov 15 '22 12:11

nikoshr