2013-01-14 64 views
22

我有一個簡單的問題。我在看的功能與兩行代碼:Backbone model.destroy():是否需要顯式從集合中刪除?

deleteTask: function() { 
    this.parent.collection.remove(this.model); 
    this.model.destroy(); 
} 

如果我註釋掉的第一行,這是應該從集合中刪除模型,事情似乎工作打算(如,模型自動刪除)。來自Backbone的網站,這是模型的「銷燬」功能的相關描述:

在模型上觸發一個「銷燬」事件,這將在包含它的任何集合中冒出來。

我可以安全地認爲,刪除this.parent.collection.remove(this.model);不會以任何方式影響代碼的功能?這是我的想法,但我想確保它。

謝謝!

回答

34

如果銷燬模型,它會從包含它的任何集合中刪除。你可以看到,在backbone source

//Internal method called every time a model in the set fires an event. 
_onModelEvent: function(event, model, collection, options) { 
    ... 
    if (event === 'destroy') this.remove(model, options); 

所以,是的,我不認爲你需要明確地從集合中刪除模型。

但不相信我,可以自己試一試:)

deleteTask: function() { 
    that = this; 
    this.model.destroy({ 
     success: function() { 
     console.log(that.parent.collection); 
     } 
    }); 
} 

檢查自己的控制檯來查看模型是否從集合中刪除。

+0

感謝您提供相關的源代碼 - 總是有助於我的理解。 – cheshireoctopus

-3

解決方案是重寫Backbone模型的銷燬函數。我在成功和回調策略的抽象模型上做了這個:

參數「數據」對應於原始參數「resp」。

destroy: function(successCallback, errorCallback) 
{ 
    var options = { wait: true }; 
    var model = this; 

    successCallback = successCallback || function() {}; 
    errorCallback = errorCallback || function() {};    

    var destroy = function() 
    { 
     model.trigger('destroy', model, model.collection, options); 
    }; 

    options.success = function(data) 
    { 
     if ('SUCCESS' === data.responseCode) 
     { 
      if (options.wait || model.isNew()) 
       destroy(); 

      successCallback(data); 

      if (!model.isNew()) 
       model.trigger('sync', model, data, options); 
     } 
     else 
     { 
      errorCallback(data); 
     } 
    }; 

    if (this.isNew()) 
    { 
     options.success(); 
     return false; 
    } 

    var xhr = this.sync('delete', this, options); 

    if (!options.wait) 
     destroy(); 

    return xhr; 
} 
+0

解決方案是什麼? OP並不是說實際上存在問題。相反,他們首先問是否會有問題。 –