dan*_*ton 5 javascript coffeescript backbone.js marionette
我正在尝试使用backbone/marionette.js从.eco模板中访问模型的方法.我有一个Expense模型day(),使用一个方法,使用moment.js,返回'13th'; 例如:
class Expense extends Backbone.Model
day: ->
moment.get('date').format('Do')
Run Code Online (Sandbox Code Playgroud)
我可以创建一个新的Expense如下,并调用该day()方法:
coffee = new Expense({name: "Coffee", amount: 2.50, date: "2014-01-13T13:50:00Z"})
coffee.day() # 13th
Run Code Online (Sandbox Code Playgroud)
但是,尝试day()从以下视图和模板中进行访问会导致一些问题:
class ExpenseView extends Marionette.ItemView
template: "views/_expense"
Run Code Online (Sandbox Code Playgroud)
# views/_expense.jst.eco
<h3 class="expense__name"><%= @name %></h3>
<p class="expense__day"><%= @day() %></p>
Run Code Online (Sandbox Code Playgroud)
我明白为什么它不工作......在ItemView电话serializeData返回@model.toJSON()......因此,Expense的day()方法是无法访问的.骨干/木偶社区中是否存在既定模式,可以为模板提供模型方法?
到目前为止,我已经完成了以下工作:
class ExpenseView extends Marionette.ItemView
template: "views/_expense"
serializeData: ->
_.extend(@model.toJSON(), model: @model)
templateHelpers:
day: ->
@model.day()
Run Code Online (Sandbox Code Playgroud)
但我不确定这是否是解决问题的最佳方法?谢谢!
小智 7
您可以随时将其添加到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')
Run Code Online (Sandbox Code Playgroud)
或者,以防止'day'属性同步到后端...
class Model extends Backbone.Model
mutators:
day:
get: -> moment.get('date').format('Do')
transient: true
Run Code Online (Sandbox Code Playgroud)
该day属性现在将出现在所有toJSON()调用中.