[英]How to access Backbone.Model methods from Marionette.js ItemView template?
我正在尝试使用backbone / marionette.js从.eco模板中访问模型的方法。 我有一个带有day()
方法的Expense
模型,使用moment.js返回'13th'; 例如:
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()
...因此,无法访问Expense
的day()
方法。 骨干/木偶社区中是否存在既定模式,可以为模板提供模型方法?
到目前为止,我已经完成了以下工作:
class ExpenseView extends Marionette.ItemView
template: "views/_expense"
serializeData: ->
_.extend(@model.toJSON(), model: @model)
templateHelpers:
day: ->
@model.day()
但我不确定这是否是解决问题的最佳方法? 谢谢!
您可以随时将其添加到templateHelpers
或serializeData
- 但您真正要问的是虚拟属性 - 可以是每个模板的一部分,该属性仅作为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()
调用中。
你为什么不把它添加到serializeData
? (不记得咖啡语法......)
serializeData: function(){
var data = _.clone(this.model.attributes);
data.day = this.model.day();
return data;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.