2013-01-14 11 views
22

Mam proste pytanie. Patrzę na funkcję z 2 linii kodu:Backbone model.destroy(): Czy konieczne jest jawne usunięcie z kolekcji?

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

Jeśli komentarz na pierwszą linię, która ma usunąć model ze swojej kolekcji, wszystko wydaje się działać zgodnie z przeznaczeniem (jak w, model jest usuwany automatycznie). Z witryny Backbone jest to odpowiedni opis funkcji "niszczenia" modelu:

Wywołuje zdarzenie "destroy" na modelu, które będzie bańką w kolekcjach, które go zawierają.

Czy mogę bezpiecznie założyć, że usunięcie this.parent.collection.remove(this.model); nie wpłynie w żaden sposób na funkcjonalność kodu? Tak myślę, ale chciałem się tego upewnić.

Dziękujemy!

Odpowiedz

34

Jeśli zniszczysz model, zostanie on usunięty z kolekcji, które go zawierały. Widać, że w 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); 

Więc tak, ja nie sądzę, by trzeba usunąć model z kolekcji wyraźnie.

Ale mi nie ufasz, test dla siebie :)

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

Sprawdź konsola dla siebie, aby zobaczyć, czy model został usunięty z kolekcji.

+0

Dziękuję za uwzględnienie odpowiedniego kodu źródłowego - zawsze pomaga w moim zrozumieniu. – cheshireoctopus

-3

Rozwiązaniem jest zastąpienie funkcji niszczenia modelu szkieletu. Zrobiłem to na abstrakcyjnym modelu z sukcesem i strategią oddzwaniania:

Parametr "dane" odpowiada pierwotnemu parametrowi "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

Rozwiązanie czego? OP nie mówi, że faktycznie istnieje problem. Raczej pytają, czy problem będzie występował w pierwszej kolejności. –

Powiązane problemy