Backbone.js 如何使用主干和CoffeeScript向集合呈现新项目?

Backbone.js 如何使用主干和CoffeeScript向集合呈现新项目?,backbone.js,Backbone.js,我有一个小表单可以添加一个项目,还有一个集合视图可以列出所有项目。但是,我不知道在何处/如何为新项目调用render: 表单视图: class FastTodo.Views.AddTodoItem extends Backbone.View template: JST['todo_items/add_item'] el: '#main' events: 'submit': 'addItem' addItem: (event) -> event.preven

我有一个小表单可以添加一个项目,还有一个集合视图可以列出所有项目。但是,我不知道在何处/如何为新项目调用render:

表单视图:

class FastTodo.Views.AddTodoItem extends Backbone.View template: JST['todo_items/add_item'] el: '#main' events: 'submit': 'addItem' addItem: (event) -> event.preventDefault() @collection.create task: $('#task').val() render: -> $(@el).html @template() initialize: -> @collection = new FastTodo.Collections.TodoItems() @render() 类FastTodo.Views.AddTodoItem扩展了主干.View 模板:JST['todo\u items/add\u item'] el:“#主要” 活动: “提交”:“附加项” 附加项:(事件)-> event.preventDefault() @collection.create任务:$('#task').val() 渲染:-> $(@el.html@template() 初始化:-> @collection=new FastTodo.Collections.TodoItems() @render() 集合视图:

class FastTodo.Views.TodoItemsIndex extends Backbone.View template: JST['todo_items/index'] render: -> console.log("render") renderOne: (item) -> console.log(item) initialize: -> @collection = new FastTodo.Collections.TodoItems() @collection.bind 'reset', => @render() @collection.on 'add', (item) => console.log('addd') @renderOne(item) @collection.fetch() 类FastTodo.Views.TodoItemsIndex扩展了主干.View 模板:JST['todo_items/index'] 渲染:-> console.log(“呈现”) renderOne:(项目)-> console.log(项目) 初始化:-> @collection=new FastTodo.Collections.TodoItems() @collection.bind“重置”,=> @render() @集合。在“添加”时,(项目)=> console.log('addd') @renderOne(项目) @collection.fetch() 我希望控制台中的输出显示一个新项。然而,我看到:


如何在集合中呈现新项目?(或显示renderOne已触发?

您的
AddTodoItem
和您的
TodoItemsIndex
需要共享完全相同的集合实例。这是主干网的设计。因此,路由器应该创建集合的单个实例,并将其在options对象中传递给这两个视图的构造函数。然后事件将正常流动,视图将保持同步。为了回应您的评论,不要将集合从一个视图传递到另一个视图,单独视图的连接应该通过路由器级别的共享模型/集合和代码来处理

您也可以为您的应用程序提供一个全局名称空间和一个共享集合,但我个人更喜欢独立的模块,而不是依赖于共享全局的所有模块


另一个要考虑的方法是,虽然我认为共享集合在你的情况下更简单和完全足够。

你在哪里创建<代码> AddodoItAs/Cuth>VIEW?创建时未将集合传递给它,这会导致在尝试使用集合创建新todo时出现
未定义
错误。这确实是我的问题,我希望在路由器级别创建所有视图。是否有其他选项可以将集合绑定到多个视图,而不将集合从一个视图传递到另一个视图?您应该有一个全局应用程序变量,它基本上初始化所有内容、路由器、视图、模型等(就像传统语言中的主函数一样)您可以将集合附加到该全局变量,并让视图从那里访问它。说这不是一个好策略。如果您的应用程序想要访问某个集合,则应直接或通过父视图(如果有)将其传递给该集合。