Deep Cloning Backbone.js Modelle

8

Ich arbeite in jquery mit backbone.js und gehe in den Fall, wo ich Modelle duplizieren muss, aber ich muss eine tiefe Kopie auf ihnen machen, so dass keine Referenzen zwischen den Kopien existieren. Modelle können andere Modelle als Attribute haben. Modelle können anon Funktionen als Attribute haben.

Also arbeite ich an der Erstellung eines Algorithmus, der die meisten Backbone-Modelle tiefklonen wird. Ich erwarte, dass alle Bindungen während dieser Kopie entfernt werden (für die neue Instanz), also mache ich mir keine Sorgen, dass ich versuche, sie zu behalten.

Ziele:

  • Kann alle einfachen Variablen (String, Int, float usw.) duplizieren und als neues Modell im neuen Modell speichern.
    • Fertig, mit toJSON erstellen Sie ein neues JSON-Objekt, das an set () übergeben werden kann. Dieses Objekt enthält nur einfache Attribute, d. H. Enthält keine Attribute, die Funktionen oder anderen Modellen zugewiesen sind.
  • Kann die anon-Funktionen duplizieren, denen einige Variablen zugewiesen werden, ohne vorher Funktions- / Attributnamen zu kennen.
    • Wenn ich den Namen des Attributs kenne, das einer Funktion zugewiesen ist, kann ich es kopieren. Aber wenn das Modell neu oder unbekannt ist, habe ich diese Information nicht.
  • Wenn ein Attribut ein anderes Backbone-Modell ist, rufen Sie den Deep-Copy-Algorithmus rekursiv für dieses Attribut auf.
    • Nicht in der Lage zu prüfen, ob ein Attribut ein Backbone-Modell mit nativen Backbone-Methoden ist, auf der Suche nach einem Workaround.

Die vereinfachte Version von dem, was ich derzeit habe, ist unten:

%Vor%

Jede Hilfe oder Einsicht, die Sie geben können, wäre sehr willkommen. Danke!

    
Daniel Gradinjan 03.08.2012, 16:06
quelle

2 Antworten

11
Mit der Methode extend von jQuery können Sie Objekteigenschaften einfach kopieren.

Hier ist ein künstliches, aber illustratives Beispiel. Es zeigt sogar, warum Sie Funktionen nicht "tief" kopieren müssen!

%Vor%

Hier ist eine Geige für Ihre Bequemlichkeit: Ссылка

Wenn Sie diesen Code ausführen, sehen Sie, dass someObj und deepCopy in der Struktur identisch sind, aber unterschiedliche Objekte.

Wie Sie sehen, ist das tiefe Kopieren von Funktionen nicht erforderlich, da die this -Referenz an jedes Objekt gebunden ist, auf das die Funktion angewendet wird. Dies liegt daran, dass in javascript der Aufruf einer Funktion als deepCopy.f() funktionell äquivalent zu deepCopy.f.call(deepCopy) ist. Ein anschauliches Beispiel:

%Vor%

Und eine Geige: Ссылка

    
WickyNilliams 03.08.2012, 16:37
quelle
4

Wenn Sie Lo-Dash als Underscore-Drop-in-Ersatz verwenden, können Sie auch _. cloneDeep

%Vor%     
tmaximini 20.08.2013 08:07
quelle