如何从Marionette.js ItemView模板访问Backbone.Model方法?

时间:2014-01-13 14:08:53

标签: javascript backbone.js coffeescript marionette

我正在尝试使用backbone / marionette.js从.eco模板中访问模型的方法。我有一个Expense模型,其中day()方法使用moment.js返回'13';例如:

class Expense extends Backbone.Model
  day: ->
    moment.get('date').format('Do')

我可以按如下方式创建新的Expense,然后调用day()方法:

coffee = new Expense({name: "Coffee", amount: 2.50, date: "2014-01-13T13:50:00Z"})
coffee.day() # 13th

但是,尝试从以下视图和模板中访问day()会导致一些问题:

class ExpenseView extends Marionette.ItemView
  template: "views/_expense"
# views/_expense.jst.eco
<h3 class="expense__name"><%= @name %></h3>
<p class="expense__day"><%= @day() %></p>

理解为什么它不起作用... ItemView调用serializeData返回@model.toJSON() ...因此,{{1} } Expense方法无法访问。骨干/木偶社区中是否存在已建立的模式,使模型方法可用于模板?

到目前为止,我已经完成了以下工作:

day()

但我不确定这是否是解决问题的最佳方法?谢谢!

2 个答案:

答案 0 :(得分:7)

您始终可以将其添加到templateHelpersserializeData - 但您真正要求的是虚拟属性 - 可以是每个模板的一部分,该属性仅用作ViewModel的一部分。通过这种方式,我们还可以禁止它在sync

save()事件上同步到服务器

有几个插件可以做到这一点,我个人最喜欢使用的是Backbone Mutators - https://github.com/asciidisco/Backbone.Mutators

Backbone Computed Fields - https://github.com/alexanderbeletsky/backbone-computedfields这样的其他人会给你Ember像计算属性。

使用Backbone Mutators,您可以在Backbone Model中编写mutator。

class Model extends Backbone.Model
  mutators:
    day: ->
      moment.get('date').format('Do')

或者阻止'day'属性同步到后端......

class Model extends Backbone.Model
  mutators:
    day:
      get: -> moment.get('date').format('Do')
      transient: true

现在,所有day来电都会显示toJSON()属性。

答案 1 :(得分:0)

为什么不将它添加到serializeData? (不能记住咖啡语法......)

serializeData: function(){
    var data = _.clone(this.model.attributes);
    data.day = this.model.day();
    return data;
}