0

destroyモデル インスタンスの呼び出しが、それが接続されている Model.List にどのように影響するかを理解するのに苦労しています。

ドキュメントには次のように記載されています。

can.Model.List が従来の can.List よりも優れている点の 1 つは、モデルを破棄すると、モデルがそのリストにある場合、リストから自動的に削除されることです。

ただし、このコードを実行すると:

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 にあるのはなぜですか? destroyedおよびremoveイベントがトリガーされないのはなぜですか?

私がデバッグしようとしている実際のコードでは、呼び出すとdestroyDELETE リクエストがトリガーされ、サーバー上でオブジェクトが期待どおりに削除されることに注意してください。ただし、Model.List からは削除されないため、関連付けられたビューからも削除されません。

4

1 に答える 1

2

モデル定義で destroy メソッドを宣言することにより、リストから要素を削除するデフォルトの destroy メソッドをオーバーライドします。したがって、そこからそのメソッドを削除するか、super を呼び出す必要があります。

これは、これが機能していることを示すフィドルです http://jsbin.com/zunox/1/edit

于 2014-02-24T02:11:09.697 に答える