Using Handlebars with Backbone

后端 未结 4 628
隐瞒了意图╮
隐瞒了意图╮ 2020-12-22 19:20

I am learning Backbone/Handlebars/Require. I have looked all over online and on SO - are there any tutorials or websites that you can direct me to that would provide helpful

相关标签:
4条回答
  • 2020-12-22 19:42

    Using handlebars.js instead of underscore templating is pretty straightforward. Check out this example:

    https://cdnjs.com/libraries/backbone.js/tutorials/what-is-a-view (scroll to the "Loading a Template" section)

    SearchView = Backbone.View.extend({
        initialize: function(){
            this.render();
        },
        render: function(){
            // Compile the template using underscore
            var template = _.template( $("#search_template").html(), {} );
            // Load the compiled HTML into the Backbone "el"
            this.el.html( template );
        }
    });
    

    Basically, the convention in backbone is to build your html in a render function. The use of templating engine is left completely up to you (which I like about Backbone). So you'd just change it to:

    SearchView = Backbone.View.extend({
        initialize: function(){
            this.render();
        },
        render: function(){
            // Compile the template using Handlebars
            var template = Handlebars.compile( $("#search_template").html() );
            // Load the compiled HTML into the Backbone "el"
            this.el.html( template );
        }
    });
    

    Since you're using require.js, you can make Handlebars a dependency at the top of your module. I'm pretty new to this, but it sounds like the learning to focus on would be Backbone.js patterns and require.js usage.

    0 讨论(0)
  • 2020-12-22 19:55

    I would prefer to compile the template once (during initialize), that way you avoid to recompile the template with every render. Also, you need to pass the model to the compilated template in order to generate the HTML:

    SearchView = Backbone.View.extend({
      initialize: function(){
        // Compile the template just once
        this.template = Handlebars.compile($("#search_template").html());
        this.render();
      },
      render: function(){
        // Render the HTML from the template
        this.$el.html(this.template(this.model.toJSON()));
        return this;
      }
    });
    
    0 讨论(0)
  • 2020-12-22 20:04
    define(["app", "handlebars",
        "text!apps/templates/menu.tpl"
    ], function (app, Handlebars, template) {
    
        return {
            index: Marionette.ItemView.extend({
                template: Handlebars.compile(template),
                events: {
                    'click .admin-menu-ref': 'goToMenuItem'
                },
                goToMenuItem: function (e) {
                   //......
                }
            })
        }
    });
    
    
     new view.index({model: models});
    
    0 讨论(0)
  • 2020-12-22 20:06

    If you are using require.js you wont be able to use the current Handlebars file. I used the following Handlebars Plugin and it seems to be kept up to date with the current version. Just replace your Handlebars file with the plugin above if Handlebars is returning null in your module.

    0 讨论(0)
提交回复
热议问题