2012-04-18 4 views
19

Ich habe es mit einer Thread-Kommentarsammlung zu tun, und wenn ich einen Kommentar mit Kindern lösche, mache ich für diesen Kommentar, und auf der Serverseite werden alle Zweige gelöscht.Backbone JS: Wie kann ich die Synchronisierung für das Löschen deaktivieren?

Ich schrieb eine Funktion, die, sobald ein Knoten aus dem Baum gelöscht wird, sucht nach allen Waisen und entfernt sie auch. Wenn ich also Waisenkinder finde, führe ich auch auf ihnen aus, aber weil sie bereits auf dem Server gelöscht sind, gibt die Synchronisierung Fehler zurück.

Gibt es eine Möglichkeit, die Synchronisierung für einige destroy() Anrufe zu deaktivieren?

+0

Ich bin neugierig, ob das Überschreiben von '.sync()' und das Hinzufügen einiger zusätzlicher Logik für die 'delete'-Methode dafür zu aufwendig wäre, oder ob es einen saubereren Weg gibt. –

+0

Nun hoffte ich nicht zu überschreiben .sync() Aber ich kann keine native Art, es zu tun sehen. Ich kann hacken, indem ich "Destroy" -Ereignisse auslöst und das Modell aus der Sammlung spleiße, aber das klingt nicht koscher. –

Antwort

31

Da alle destroy Methode tut, ist eine DELETE-Anfrage senden und löst destroy, einfach destroy Auslösung ist genau das, was Sie suchen.

Ja, es fühlt sich ein bisschen hackish, aber das ist so ziemlich alles Backbone-Code sowieso. Wenn Sie möchten, und wenn Sie ein Basismodell haben, von dem Sie ausgehen, könnten Sie dies als eine Methode für dieses Basismodell hinzufügen, und es fühlt sich vielleicht nicht ganz so hackisch an.

+0

Danke @ Edward. Am Ende löschte ich sie einfach aus der Sammlung. –

+8

'' 'model.collection.remove (model);' '' funktioniert. – forresto

+4

@forresto - das funktioniert, wenn das Modell nur in einer einzigen Sammlung ist. Wenn das Modell aus mehreren Sammlungen besteht, müssen Sie wissen, in welchen Sammlungen sich das Modell befindet, und das für jede Sammlung tun. Dies bedeutet, dass Sie im Modell verfolgen, zu welchen Sammlungen es gehört. Das ist irgendwie rückwärts. Durch das Auslösen von "destroy" auf dem Modell werden alle darin enthaltenen Sammlungen entfernt und Sie müssen nicht verfolgen, in welchen Sammlungen sich das Modell befindet. –

2

Dies ist etwas spät, könnte aber als alternative Lösung für andere Leute mit dem gleichen Problem funktionieren.

Konfrontiert mit einem sehr ähnlichen Problem, landete ich alle Kinder IDs auf null vor dem Aufruf destroy auf ihnen. Auf diese Weise denkt Backbone, dass sie neue sind und keine DELETE HTTP-Anforderung an den Server beim Entfernen spawnen.

deleteParent: function() { 
    this.model.children.each(function(child) { 
    // Set to null so that it doesn't try to spawn a 'DELETE' http request 
    // on 'destroy' since thinks its new (hack). 
    child.id = null; 
    child.destroy(); 
    }); 
    // This one DOES result in a 'DELETE' http request since it has an ID. 
    this.model.destroy(); 
}, 
+0

Nun, was wäre ein Zweck der Zerstörung ohne tatsächlich vom Server zu löschen? –

+0

Wenn ich Ihre Frage richtig verstanden habe, wenn Sie die Eltern vom Server löschten, löschten Sie auch alle Kinder (vielleicht in einer Transaktion), also wenn Sie die Kinder aus der UI entfernen (* destroy *), die Sie nicht wollen um den Server anzurufen, um alle oder die Waisen zu löschen, da sie nicht mehr existieren. Dies erreicht das gewünschte Verhalten. – fcarriedo

1

Ran in das gleiche Problem.

des Modells Link zu seiner enthält Sammlung Unter Verwendung des Modells aus dieser Sammlung zu entfernen, war meine bevorzugte Lösung, da dies genau das war, was ich zu tun und sehr klar im Code gesucht:

// From the view 
this.model.collection.remove(this.model); 
+0

Obwohl das Modell aus der Sammlung entfernt wird, löst dies nicht das Zerstörungs-Ereignis aus, das Probleme verursachen kann, wenn Sie ein Ereignis hören. –

1

Aufbauend auf fcarriedo Antwort außer Kraft setzen, nur um die Methode destroy in Deklaration Ihres Modells:

Models.YourModelName = Backbone.Model.extend({ 
    destroy: function() { 
     this.id = null; 
     Backbone.Model.prototype.destroy.apply(this, arguments); 
    } 
}); 
2

Dies Sie zerstören Anruf respektieren können, einschließlich Erfolg Handler

Backbone.Model.extend({ 
    destroy: function (options) { 
     // don't make a server call, just delete from collection and call success 
     this.trigger('destroy', this, this.collection, options); 
     if (options && options.success) { 
       options.success(); 
     } 
    } 
});