使用CanJS,如何在实例被销毁时自动从Model.List中删除模型实例?

时间:2014-02-23 09:13:06

标签: javascript canjs canjs-model

我很难理解如何调用模型实例上的destroy会影响它附加的Model.List。

The documentation声明:

  

can.Model.List优于传统的can.List的一个优点是   当你销毁一个模型时,如果它在那个列表中,它就会   自动从列表中删除。

但是,当我运行此代码时:

var Todo = can.Model.extend({
  destroy: function() {
    console.log("Calling destroy function");                                            
    return can.Deferred();
  }       
},{})   

Todo.bind("destroyed", function(ev, todo) {                                             
   console.log("Todo \"" + toto.name + "has been destroyed");                           
}); 


var todo1 = new Todo({ name: "Do the dishes", id: 1 });                                 
var todo2 =   new Todo({ name: "Wash floors", id: 2 });                                 
var todos = new can.Model.List([todo1, todo2]);                                         

todos.bind("remove", function( ev, oldVals, indx ) {                                    
  console.log("todo"+indx+" removed")
})         

console.log("Before destroy I have " + todos.length + " elements");                     
console.log("First element is \"" + todos[0].name + "\"");                              
var destroyed = todos[0].destroy()
console.log("After destroy I have " + todos.length + " elements");                      
console.log("First element is \"" + todos[0].name + "\"");

以下是我在控制台中看到的内容:

Before destroy I have 2 elements
First element is "Do the dishes"
Calling destroy function
After destroy I have 2 elements
First element is "Do the dishes"

为什么在调用destroy后元素仍然在Model.List中?为什么没有触发destroyedremove事件?

请注意,在我尝试调试的实际代码中,调用destroy会触发DELETE请求,并且会按预期在服务器上删除该对象。但是它不会从Model.List中删除,因此也不会从关联的视图中删除。

1 个答案:

答案 0 :(得分:2)

通过在模型定义中声明destroy方法,您将覆盖默认的destroy方法,该方法负责从列表中删除元素。所以你需要从那里删除那个方法,或者调用super。

这是一个显示这种工作的小提琴 http://jsbin.com/zunox/1/edit