Javascript 使用CanJS,如何从模型中自动删除模型实例。在实例被销毁时列出?

Javascript 使用CanJS,如何从模型中自动删除模型实例。在实例被销毁时列出?,javascript,canjs,canjs-model,Javascript,Canjs,Canjs Model,我很难理解在模型实例上调用destroy会如何影响模型 声明: 与传统的can.List相比,can.Model.List的一个优点是 当你摧毁一个模型时,如果它在列表中,它会 将自动从列表中删除 但是,当我运行此代码时: var Todo = can.Model.extend({ destroy: function() { console.log("Calling destroy function");

我很难理解在模型实例上调用
destroy
会如何影响模型

声明:

与传统的can.List相比,can.Model.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"
为什么调用后元素仍在Model.List中?为什么没有触发
销毁
删除
事件


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

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

这是一把小提琴,它显示了这一点

这可能不会发生在您的实际代码中,但在上面的示例中,从
destroy
返回的延迟似乎从未得到解决(因此Todo将永远不会被删除)。我知道,我的代码示例引入了一个不同的问题,因为我希望它是自包含的,并且不知道can.fixture。我试图调试的代码实际上并没有覆盖destroy方法,它使用了一个字符串,就像在fiddle中一样。实际上,如果我在有问题的代码中添加一个fixture,那么模型实例确实会从列表中删除。我试图调试的代码来自《七周七个Web框架》一书:所以现在我不知道如何在服务器不运行的情况下复制它+我从你的回答中学到了这一点。