【问题标题】:Passing Backbone Model attribute to Handlebars Helper将主干模型属性传递给 Handlebars Helper
【发布时间】:2016-04-26 03:35:29
【问题描述】:

Backbone 模型具有“selectedYear”属性。我需要将此“selectedYear”属性传递给 Handlebars Custom Helper。

var sq2SelectCarYearModel = Backbone.Model.extend({

    urlRoot: "api/caryears",
    selectedYear: "0"


});

这是我尝试过的: 这是车把模板:

template: Handlebars.compile("{{#times 27 this.model.attributes.selectedYear}}{{/times}}")

Handlebars Helper 声明:

Handlebars.registerHelper('times', function(n, selectedYear, block) {
    // I need to use "this.model.attributes.selectedYear" here

});

PS:“times”是自定义助手的名称,“n”是循环运行的次数。

我也试过这个:

template: Handlebars.compile("{{#times 27 selectedYear}}{{/times}}")

但还是不行。

【问题讨论】:

  • 想知道答案是否有帮助...!

标签: javascript backbone.js handlebars.js


【解决方案1】:

您应该在模型的defaults 中设置selectedYear

var sq2SelectCarYearModel = Backbone.Model.extend({
  urlRoot: "api/caryears",
  defaults: {
   selectedYear: "0"
  }
});

以便将其添加到模型attributes 属性中。在创建后设置它,您应该使用set() 方法将属性添加到模型属性哈希中。

现在,它作为直接属性添加到模型中,this.model.selectedYear 可能有效,但不是正确的方法。数据应该添加到模型属性哈希中,以便其他事情(如事件)正常工作

【讨论】:

    【解决方案2】:

    selectedYear 不是模型的属性,而是属性。

    您可以通过以下方式将其设置为默认值:

    var CarModel = Backbone.Model.extend({
      urlRoot: 'api/caryears',
    
      defaults: {
        selectedYear: 0
      }
    });
    
    var model = new CarModel()
    // model.get('selectedYear') -> 0
    

    你也可以在实例化时传递它

    var model2 = new Model({ selectedYear: 2 });
    // model2.get('selectedYear') -> 2
    

    也可以在实例化后设置:

    var model3 = new Model();
    model3.set('selectedYear', 3);
    // model3.get('selectedYear') -> 3
    

    编辑

    要在主干视图中使用模型属性,我建议执行以下操作

    var MyView = Backbone.View.extend({
      initialize: function() {
        this.model = new Model({
          selectedYear: 1
        });
      },
    
      render: function() {
        var template = Handlebars.compile("{{#times 27 selectedYear}}{{/times}}");
        this.$el.html(template(this.model.toJSON));
      }
    });
    

    Backbone.Marionette 为您做了很多 - 如果您为 Marionette View 提供模板,它将自动传入模型属性,因此您无需提供 render 方法。

    例如:

    var MyView = Marionette.ItemView.extend({
      template: Handlebars.compile('your template here')
    });
    
    var model = new Model({selectedYear: 1});
    
    var view = new view({model: model});
    
    view.render();
    
    // or region.show(view) which will automatically render the view.
    

    【讨论】:

    • 谢谢,当我尝试将参数作为值传递给车把时,它可以正常工作,如:{{#times 27 '1993'}}{{/times}},如您所见我将“1993”作为参数传递,我可以在 Handlebars 助手声明中使用它,但我需要传入 model.selectedYear 以使其动态
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多