Javascript 如何从Marionette.js ItemView模板访问主干.Model方法?
我正在尝试使用backbone/marionete.js从.eco模板中访问模型的方法。我有一个带有Javascript 如何从Marionette.js ItemView模板访问主干.Model方法?,javascript,backbone.js,coffeescript,marionette,Javascript,Backbone.js,Coffeescript,Marionette,我正在尝试使用backbone/marionete.js从.eco模板中访问模型的方法。我有一个带有day()方法的Expense模型,该方法使用moment.js返回'13th';例如: 类费用扩展主干。模型 日期:-> 时刻。获取('date')。格式('Do')) 我可以创建一个新的Expense,如下所示,并调用day()方法: coffee=新费用({name:“coffee”,金额:2.50,日期:2014-01-13T13:50:00Z}) 咖啡日(13日) 但是,尝试从以下视
day()
方法的Expense
模型,该方法使用moment.js返回'13th';例如:
类费用扩展主干。模型
日期:->
时刻。获取('date')。格式('Do'))
我可以创建一个新的Expense
,如下所示,并调用day()
方法:
coffee=新费用({name:“coffee”,金额:2.50,日期:2014-01-13T13:50:00Z})
咖啡日(13日)
但是,尝试从以下视图和模板中访问day()
,会导致一些问题:
class ExpenseView扩展了Marionette.ItemView
模板:“视图/_费用”
#视图/_expense.jst.eco
我理解它为什么不工作,ItemView
调用serializeData
,它返回@model.toJSON()
。。。因此,Expense
的day()
方法无法访问。在主干网/木偶网社区中是否有一个已建立的模式,使模型方法可用于模板
到目前为止,我已经完成了以下工作:
class ExpenseView扩展了Marionette.ItemView
模板:“视图/_费用”
序列化数据:->
_.extend(@model.toJSON(),model:@model)
模板帮助程序:
日期:->
@模型日()
但我不确定这是否是解决这个问题的最好办法?谢谢 为什么不把它添加到
序列化数据中呢?(不记得咖啡语法…)
您始终可以将其添加到模板帮助程序
或序列化数据
——但您真正需要的是一个虚拟属性——它可以是每个模板的一部分,一个仅用作视图模型
一部分的属性。通过这种方式,我们还可以在sync
事件(如save()
有几个插件可以做到这一点,我个人最喜欢使用的是主干变异器
-
其他类似于主干计算字段的字段
——提供类似余烬的计算属性
使用主干变异器,您可以在主干模型中编写变异器
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()
调用中。谢谢Brian,我非常喜欢这个主干。Mutators插件!我喜欢它将逻辑从我的视图转移到模型中的方式——有点像:rails中的范围。transient:true
也是一个不错的添加!谢谢David,我在想也许最好还是重写Expense
的toJSON
方法……这样逻辑就封装在模型中而不是视图中了?问题是,如果将它添加到toJSON
中,它也会被发送到API端点,这可能是个问题。啊,我明白了。也许我可以扩展serializeData
的所有木偶。查看s,这样它就可以调用一个新方法toData
(或者更好的名称),如果它存在的话,否则就正常地调用toJSON
。然后我可以选择在我的任何模型中实现toData
,以将模型属性与我选择的任何自定义属性合并?这是一种可能性。或者使用要添加的额外参数定义一个extendJSON
方法。然后在木偶网的serailzeData
中,您只需通过添加extendJSON
的结果来扩展返回的正常值(如果extendJSON
已定义)。这将避免代码重复。
class Model extends Backbone.Model
mutators:
day:
get: -> moment.get('date').format('Do')
transient: true