Ich habe eine einfache Frage zu Backbone.js' get und set - Funktionen.
1) Wie kann ich mit dem folgenden Code obj1.myAttribute1 direkt 'abrufen' oder 'setzen'?
Eine andere Frage:
2) Wo kann / sollte ich im Modell neben dem Standardobjekt die anderen Attribute meines Modells deklarieren, damit auf sie über die get- und set-Methoden von Backbone zugegriffen werden kann?
var MyModel = Backbone.Model.extend({
defaults: {
obj1 : {
"myAttribute1" : false,
"myAttribute2" : true,
}
}
})
var MyView = Backbone.View.extend({
myFunc: function(){
console.log(this.model.get("obj1"));
//returns the obj1 object
//but how do I get obj1.myAttribute1 directly so that it returns false?
}
});
Ich weiß, dass ich tun kann:
this.model.get("obj1").myAttribute1;
aber ist das eine gute Praxis?
javascript
backbone.js
backbone-model
FortuneRice
quelle
quelle
defaults
Dies ist zwar keine Antwort auf die Frage: Wenn Sie in (obj1 in diesem Fall) ein Objekt angeben (alles, was als Referenz übergeben wird), wird dasselbe Objekt für alle Instanzen des Modells freigegeben. Die derzeitige Praxis besteht darin,defaults
eine Funktion zu definieren , die ein Objekt zurückgibt, das als Standard verwendet werden soll. backbonejs.org/#Model-defaults (siehe den kursiven Hinweis)Antworten:
Es
this.model.get("obj1").myAttribute1
ist zwar in Ordnung, aber ein bisschen problematisch, weil Sie dann möglicherweise versucht sind, das Gleiche für das Set zu tun, d. H.Wenn Sie dies tun, erhalten Sie jedoch nicht die Vorteile von Backbone-Modellen
myAttribute1
wie Änderungsereignisse oder Validierung.Eine bessere Lösung wäre, niemals POJSOs ("einfache alte JavaScript-Objekte") in Ihren Modellen zu verschachteln und stattdessen benutzerdefinierte Modellklassen zu verschachteln. Es würde also ungefähr so aussehen:
Dann wäre der Zugangscode
aber was noch wichtiger ist, wäre der Einstellungscode
die geeignete Änderungsereignisse und dergleichen auslösen. Arbeitsbeispiel hier: http://jsfiddle.net/g3U7j/
quelle
Uncaught TypeError: Object #<Object> has no method 'set'
Backbone.Model
sind und dann mit dem Sprudeln magischer Ereignisse beginnen.Ich habe dafür ein Backbone-Deep-Modell erstellt - erweitern Sie einfach Backbone.DeepModel anstelle von Backbone.Model, und Sie können dann Pfade verwenden, um verschachtelte Modellattribute abzurufen / festzulegen. Es werden auch Änderungsereignisse verwaltet.
quelle
//You can use index notation to fetch from arrays console.log(model.get('otherSpies.0.name')) //'Lana'
Die Lösung von Domenic wird funktionieren, jedoch wird jedes neue MyModel auf dieselbe Instanz von Obj verweisen. Um dies zu vermeiden, sollte MyModel folgendermaßen aussehen:
Eine vollständige Erklärung finden Sie in der Antwort von c3rin unter https://stackoverflow.com/a/6364480/1072653 .
quelle
Ich benutze diesen Ansatz.
Wenn Sie ein Backbone-Modell wie dieses haben:
Sie können das Attribut "ab" setzen mit:
Jetzt hat Ihr Modell Attribute wie:
mit dem Ereignis "change" ausgelöst.
quelle
meta2= m.get('x'); meta2.id=110; m.set('x', meta2)
. Dies löst für mich kein Änderungsereignis aus :(_.clone(m.get('x'))
. dankesetting
mit dem Objekt vergleichen, das Siegetting
zur festgelegten Zeit sind. Wenn Sie also die beiden Objekte nicht klonen, sind die beiden verglichenen Objekte zur festgelegten Zeit genau gleich.Es gibt eine Lösung, an die noch niemand gedacht hat und die viel zu gebrauchen ist. Sie können verschachtelte Attribute tatsächlich nicht direkt festlegen, es sei denn, Sie verwenden eine Bibliothek eines Drittanbieters, die Sie wahrscheinlich nicht möchten. Sie können jedoch einen Klon des ursprünglichen Wörterbuchs erstellen, die verschachtelte Eigenschaft dort festlegen und dann das gesamte Wörterbuch festlegen. Stück Kuchen.
quelle
Ich hatte das gleiche Problem, das @pagewil und @Benno mit der Lösung von @ Domenic hatten. Meine Antwort war, stattdessen eine einfache Unterklasse von Backbone.Model zu schreiben, die das Problem behebt.
Was NestedModel für Sie tut, ist zuzulassen, dass diese funktionieren (was passiert, wenn myModel über JSON-Daten festgelegt wird):
Es wäre einfach, die Modellliste beim Initialisieren automatisch zu generieren, aber diese Lösung war gut genug für mich.
quelle
Die von Domenic vorgeschlagene Lösung weist einige Nachteile auf. Angenommen, Sie möchten das Ereignis "Ändern" anhören. In diesem Fall wird die Methode 'initialize' nicht ausgelöst und Ihr benutzerdefinierter Wert für das Attribut wird durch das json-Objekt vom Server ersetzt. In meinem Projekt war ich mit diesem Problem konfrontiert. Meine Lösung zum Überschreiben der 'set'-Methode des Modells:
quelle
Während in einigen Fällen die Verwendung von Backbone-Modellen anstelle von verschachtelten Objektattributen sinnvoll ist, wie in Domenic erwähnt, können Sie in einfacheren Fällen eine Setter-Funktion im Modell erstellen:
quelle
Wenn Sie mit dem Backend interagieren, für das ein Objekt mit Verschachtelungsstruktur erforderlich ist. Aber mit Backbone einfacher mit linearer Struktur zu arbeiten.
backbone.linear kann Ihnen helfen.
quelle