Backbone.js 如何为包含“添加新视图”的集合呈现项目视图?

Backbone.js 如何为包含“添加新视图”的集合呈现项目视图?,backbone.js,coffeescript,Backbone.js,Coffeescript,我不明白为什么在集合视图渲染中不更新DOM: class FastTodo.Views.TodoItemsIndex extends Backbone.View template: JST['todo_items/index'] el: '#main' render: -> $(@el).html @form_view.render() @collection.each @renderOne renderOne: (item) -> console

我不明白为什么在集合视图渲染中不更新DOM:

class FastTodo.Views.TodoItemsIndex extends Backbone.View template: JST['todo_items/index'] el: '#main' render: -> $(@el).html @form_view.render() @collection.each @renderOne renderOne: (item) -> console.log(@) console.log(@el) $(@el).append "model data" initialize: -> @collection = new FastTodo.Collections.TodoItems() @form_view = new FastTodo.Views.AddTodoItem collection: @collection @collection.bind 'reset', => @render() @collection.on 'add', (item) => @renderOne(item) @collection.fetch() 类FastTodo.Views.TodoItemsIndex扩展了主干.View 模板:JST['todo_items/index'] el:“#主要” 渲染:-> $(@el.html@form_view.render() @collection.each@renderOne renderOne:(项目)-> console.log(@) console.log(@el) $(@el).附加“模型数据” 初始化:-> @collection=new FastTodo.Collections.TodoItems() @form_view=new FastTodo.Views.AddTodoItem集合:@collection @collection.bind“重置”,=> @render() @集合。在“添加”时,(项目)=> @renderOne(项目) @collection.fetch() 其思想是#main首先使用addnewform获取视图,然后将集合附加到#main

我该怎么做

控制台中视图的输出如下所示:

1)For
@collection.each@renderOne
要正常工作,您需要将
renderOne
方法绑定到视图实例,如下所示:
renderOne:(item)=>
(请注意fat箭头),否则它将在全局上下文中调用(这就是您在控制台中看到这些
窗口
对象的原因

2) 应该将DOM元素而不是视图本身插入DOM,因此
$(@el).html@form\u view.render()
应该写成
@$el.html@form\u view.render().el
render
方法应该根据主干社区约定返回视图实例)

其他的看起来不错,应该是这样的

您可能希望参考一些关于js中上下文的帖子,以便更深入地理解主题(例如)

顺便说一句,你可以为一些事情写更少的代码。例如,这个

@collection.bind 'reset', =>
  @render()
@collection.on 'add', (item) =>
  @renderOne(item)
会变成这样吗

@collection.on 'reset', @render
@collection.on 'add', @renderOne

但是,在本例中,您应该记住使用胖箭头绑定
render
方法。

谢谢!使用coffeescript的上下文绑定现在更清晰了