在CoffeeScript中将现有HTML表示为Backbone.js数据结构
我在这件事上感到很难过 我有一个HTML列表,我想使用Backbone.js来处理这些列表项上的事件。这是我到目前为止得到的。这是一个简化的场景,可以帮助我更好地理解如何构造更大的应用程序。对于我的示例,我只想将现有的HTML列表摄取到主干结构中,并通过主干视图处理单击事件 我在视图中使用@model时遇到了一个错误,但我相当确定我在概念上误解了这里的内容 咖啡脚本:在CoffeeScript中将现有HTML表示为Backbone.js数据结构,backbone.js,coffeescript,Backbone.js,Coffeescript,我在这件事上感到很难过 我有一个HTML列表,我想使用Backbone.js来处理这些列表项上的事件。这是我到目前为止得到的。这是一个简化的场景,可以帮助我更好地理解如何构造更大的应用程序。对于我的示例,我只想将现有的HTML列表摄取到主干结构中,并通过主干视图处理单击事件 我在视图中使用@model时遇到了一个错误,但我相当确定我在概念上误解了这里的内容 咖啡脚本: $ -> class Item extends Backbone.Model name: null
$ ->
class Item extends Backbone.Model
name: null
class ItemList extends Backbone.Collection
model: Item
class ItemView extends Backbone.View
tagName: 'li'
initialize: =>
@model.bind('change', this.render)
@model.view = this
events:
'click' : 'clicked'
clicked: ->
console.log 'clicked'
render: =>
this
class ItemListView extends Backbone.View
el: $('ul#test')
initialize: =>
$('li', @el).each(@addItem)
addItem: (item) ->
item = new ItemView({ el: item })
render: =>
this
Items = new ItemListView
HTML:
- 嗨,塔尔
- 嗯
- 嗯
这里是我之前开始的一个JSFIDLE:我从来都不喜欢CoffeeScript(Javascript这么好,为什么要替换它?),但这里似乎有一些问题:
- 您在
上遇到错误,因为您从未在@model
项目视图上设置它。这不是自动发生的-您必须在
中实例化视图的模型,或者将其传递给构造函数,例如:initialize()
addItem: (item) -> model = new ItemView({ el: item, model: new Item({ // assuming you might want the list item text // in the model data text: $(item).text() }) })
- 您通常只想在
中指定一个选择器,而不是jQuery对象-否则,当您加载主干代码时,DOM可能没有准备好:el
el:'#test'
- 无论在
中执行什么操作,都需要将选项对象传递给initialize()
构造函数,而不仅仅是一个参数:ItemListView
addItem: (item) ->
model = new ItemView({
el: item,
model: new Item({
// assuming you might want the list item text
// in the model data
text: $(item).text()
})
})
class ItemListView extends Backbone.View
initialize: (opts) =>
opts.items.each(@addItem)
// ...
Items = new ItemListView({ items: $('ul#test li') })