2011-06-01 74 views
0

通过添加一些额外的功能来了解backbone.js(Todos App)框架的内部,我的Todos App在两个集合,原始TodoList和我自己的触发器上触发collection.add事件UnsavedListCollection添加事件触发两个独立的集合

这是我做过什么:

添加一个“马克完成”按钮来记录槽_.template,检查所有选中的复选框,而不更改保存到服务器。

将'Save({unsaved collection length})'按钮添加到文档槽_.template。

要做到这一点,我跟踪所有型号的“savedState”的TodoList的

// inside TodoList 
hasUnsaved: function() { 
    return this.filter(function(todo) { 
    var isEqual = _.isEqual(todo.savedAttributes, todo.attributes); 
    return !isEqual; 
    }) 
}, 

声明和实例UnsavedList:

// inside window 
window.UnsavedList = Backbone.Collection.extend({ 

    model: Todo, 

    initialize: function() { 
     this.bind('add', this.addHandler) 
    }, 

    addHandler: function() { 
     alert('added') 
    } 
}); 

window.UnsavedTodos = new UnsavedList; 

作为原始样品中,添加事件势必要增加一个Handler。

// inside AppView 
... 
initialize: function() { 
    Todos.bind('add', this.addOne); 
    ... 
} 

侦听到 '马克完成' 按钮点击调用markAllDone这反过来又触发 '的变化:allDone':

// inside AppView 
markAllDone: function() { 
    Todos.each(function(todo) { 
     todo.set({ done: true }); 
    }) 
    Todos.trigger('change:allDone'); 

}, 

...和 ​​'变化:allDone' 所调用:

// inside AppView 
checkSaved: function() { 
    this.$('#todo-controls #button-saved').html(this.buttonSavedTemplate({ 
     saved: function() { 
      var list = Todos.hasUnsaved(); 
      _.each(list, function(todo) { 
       UnsavedTodos.add(todo); 
      }) 
      return list.length; 
     } 
    })); 
}, 

如果你看看我的模板对象的迭代器,我将所有未保存的模型添加到我的UnsavedList中。但奇怪的是,TodoList还监听这个确切的“添加”事件,所有未保存的模型都显示在页面上。

为什么这么说,即使很难我只是'添加'到UnsavedList。

想法?

回答

0

即使我可能一直生活在一个十沉默:真正}选项,我太好奇这个行为,并想出我自己找的源代码:

每次模型被添加到收藏,模型本身触发添加事件。而在我的情况下,两个,在TodoList的以及UnsavedList正在听“添加”

下面是Backbone.js的剪断代码:

// inside _add 
if (!options.silent) model.trigger('add', model, this, options); 

步行解决这个(想我要保持我的事件流动),我只存储模型的克隆副本是这样的:

UnsavedTodos.add(_.clone(todo), { silent: false }); 

我敢肯定,它更容易这一点使用嵌套集合或任何处理相同的模型,而不是克隆来完成,我设法保持跟踪我的未保存(克隆)模型通过事件触发每个ti我在保存,创建或销毁之后。

This is my completed modified Todos App