将Backbone Model属性传递给Handlebars Helper

时间:2016-01-20 10:30:07

标签: javascript backbone.js handlebars.js

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}}")

但它仍然无效。

2 个答案:

答案 0 :(得分:1)

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

修改

要在Backbone View中使用模型属性,我建议执行类似以下的操作

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方法。 / p>

例如:

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.

答案 1 :(得分:0)

您应该在模型selectedYear中设置defaults

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

这样它就会被添加到模型attributes属性中。要在创建后进行设置,您应该使用set()方法,该方法会将属性添加到模型属性哈希。

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