Render a Backbone.js collection

前端 未结 2 1223
走了就别回头了
走了就别回头了 2021-01-17 09:53

I am a Backbone.js n00b and trying to get my head around it. I know how to render a model using a view and the built-in underscore.js templating engine. Now I\'m trying to r

2条回答
  •  悲&欢浪女
    2021-01-17 10:28

    The problem is that when you define ContinentsView, the template is evaluated and it uses $('#continents-template') - but the DOM is not ready yet, so it does not find the template.

    To solve it, simply move the template assignment in the initialize function:

    ContinentsView = Backbone.View.extend({
      el: '#continents',
      initialize: function() {
         this.template = _.template($('#continents-template').html());
      }
      ...
    

    Regarding collections, yes, they are grouping objects, specifically sets of models.

    You should make the code so the models (and collections) do NOT know about the views, only the views know about models.

    ContinentModel = Backbone.Model.extend({});
    
    ContinentsCollection = Backbone.Collection.extend({
      model: ContinentModel,
      // no reference to any view here    
    });
    
    ContinentsView = Backbone.View.extend({
      el: '#continents',
    
      initialize: function() {
        this.template = _.template($('#continents-template').html());
        // in the view, listen for events on the model / collection
        this.collection.bind("reset", this.render, this);
      },
    
      render: function() {
        var renderedContent = this.template(this.collection.toJSON());
        $(this.el).html(renderedContent);
        return this;
      }
    });
    
    $(function() {
      var continentsCollection = new ContinentsCollection();
      continentsCollection.reset([{name: "Asia"}, {name: "Africa"}]);
      // initialize the view and pass the collection
      var continentsView = new ContinentsView({collection: continentsCollection});
    });
    

提交回复
热议问题