Backbone.js - Erstellen einer Sammlung mit bindungsfähigen Eigenschaften

8

Dies ist ein etwas erfundenes Beispiel, aber ich glaube, es bringt den Punkt über.

Sagen wir, ich habe eine Rückgrat-Autosammlung. Und für die Sammlung möchte ich eine Eigenschaft namens isValid. Ich möchte, dass andere Objekte an isValid binden und eine Funktion auslösen können, wenn isValid sich ändert. Die Eigenschaft sammlungValid wird basierend auf den Modellen in einer Sammlung als Ganzes geändert.

Wenn zum Beispiel alle Türen an jedem Fahrzeug verriegelt sind, sollte sich das isValid auf true ändern. Wenn sich isValid ändert, sollten alle Funktionen, die an isValid change-Ereignis gebunden sind, ausgelöst werden.

Meine Frage ist, wie kann ich eine Sammlung erstellen, die über bindbare Eigenschaften verfügt, die den Modelleigenschaften ähnlich sind?

Dies ist der Code, den ich gerne benutzen würde.

%Vor%

Aktualisieren

Siehe meine vollständige Lösung als Antwort unten.

    
Mike Barlow - BarDev 27.01.2012, 00:16
quelle

3 Antworten

5

Es gibt also keine integrierte Möglichkeit, auf Eigenschaftenänderungen in einer Collection zu reagieren, da es wirklich keine (mir bekannte) unterstützte Eigenschaft für Eigenschaften in einer Collection gibt. Wie auch immer, es ist immer noch möglich, denke ich. (ungetestet, sollte aber ziemlich nah sein)

%Vor%

Eine Anmerkung: Sie wollen nicht, dass isValid: als Eigenschaft aufgeführt wird, als ob Sie Modell oder URL wären. Dies scheint das Rückgrat merkwürdig zu machen und Ihr isValid könnte alle Instanzen der Sammlung umfassen. Es ist besser, sie als Initialisierer zu definieren, und jedes Mal, wenn Sie diese Sammlung instanziieren, haben Sie eine Instanz von isValid, auf die Sie mit this.isValid zugreifen können.

    
spotman 27.01.2012, 00:38
quelle
5

Sie könnten so etwas verwenden;

%Vor%

Tun Sie das einfach, um die Eigenschaft hinzuzufügen;

%Vor%

Warnung obwohl; Ältere Versionen von IE unterstützen Object.defineProperty nicht.

    
Stephen Belanger 27.01.2012 06:58
quelle
2

Hier ist meine vollständige Lösung für diese Frage: jsFiddle Vollständiges Beispiel

@spotmat brachte mich in die richtige Richtung, aber ich musste zusätzliche Funktionalität hinzufügen. Hier sind ein paar Dinge, die gelöst werden müssen:

  • Der Auflistungskonstruktor muss mit Daten umgehen, die ihm zugeordnet sind
  • Wenn eine IsLocked-Eigenschaft des Modells aktualisiert wird, muss die Sammlung erneut validiert werden

Ich bin mir nicht sicher, ob das Hinzufügen von Bindungseigenschaften zu einer Sammlung eine großartige Idee ist, aber es war etwas Spaß, es herauszufinden, und ich habe viel gelernt.

%Vor%

Diese Ansicht dient nur zu Debugging-Zwecken

%Vor%

Der folgende Code wird zum Testen der Sammlung verwendet

%Vor%     
Mike Barlow - BarDev 27.01.2012 06:34
quelle

Tags und Links