0

我有一个小表单来添加一个项目,以及一个列出所有项目的集合视图。但是,我没有看到在哪里/如何为新项目调用渲染:

表单视图:

类 FastTodo.Views.AddTodoItem 扩展 Backbone.View

  模板:JST['todo_items/add_item']

  埃尔:'#main'

  事件:
    “提交”:“添加项目”

  添加项目:(事件)->
    event.preventDefault()
    @collection.create 任务:$('#task').val()

  渲染:->
    $(@el).html @template()

  初始化:->
    @collection = new FastTodo.Collections.TodoItems()
    @使成为()

收藏视图:

类 FastTodo.Views.TodoItemsIndex 扩展 Backbone.View

  模板:JST['todo_items/index']

  渲染:->
    console.log("渲染")

  renderOne:(项目)->
    控制台日志(项目)

  初始化:->
    @collection = new FastTodo.Collections.TodoItems()
    @collection.bind '重置',=>
      @使成为()
    @collection.on 'add', (item) =>
      console.log('添加')
      @renderOne(项目)
    @collection.fetch()

我希望控制台中的输出显示一个新项目。但是,我看到:

控制台输出添加新的主干视图

如何在集合中呈现新项目?(或者显示 renderOne 被触发了?)

4

1 回答 1

1

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

您还可以为您的应用程序拥有一个全局命名空间和一个共享集合,就像在此处的 TodoMVC 示例项目中所做的那样,但我个人更喜欢独立模块,而不是依赖于共享全局变量的所有内容。

另一种要考虑的方法是此处描述的调解器模式,尽管我认为共享集合在您的情况下更简单且完全足够。

于 2013-03-03T17:10:50.740 回答