Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从Marionette.js ItemView模板访问主干.Model方法?_Javascript_Backbone.js_Coffeescript_Marionette - Fatal编程技术网

Javascript 如何从Marionette.js ItemView模板访问主干.Model方法?

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日) 但是,尝试从以下视

我正在尝试使用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()
,会导致一些问题:

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