Backbone: Benutzerdefinierte Ansichtsattribute werden von verschiedenen Instanzen gemeinsam genutzt

Erstellt am 19. Apr. 2012  ·  9Kommentare  ·  Quelle: jashkenas/backbone

Bitte sehen Sie diese Geige: http://jsfiddle.net/XgPyH/31/

Wir erstellen also 10 Instanzen von itemView und rufen die addItem-Methode auf, um jeder itemView 10 Elemente hinzuzufügen. Jede itemView sollte 10 Elemente in ihrer itemArray-Eigenschaft enthalten. Stattdessen teilen sie die itemArray-Eigenschaft und enthalten 100 Elemente.

Das Problem könnte sein, dass backbone.view die benutzerdefinierten Attribute im Konstruktor nicht zurücksetzt.

question

Hilfreichster Kommentar

Ja, da itemArray eine Eigenschaft des Prototyps itemView , wird sie von allen Instanzen von itemView . Wenn Sie möchten, dass Instanzen ihre eigenen itemArray , sollten Sie diese in initialize oder im Konstruktor festlegen.

var ItemView = Backbone.View.extend({

  initialize: function() {
    this.itemArray = [];
  },

  ...

});

Alle 9 Kommentare

Ja, da itemArray eine Eigenschaft des Prototyps itemView , wird sie von allen Instanzen von itemView . Wenn Sie möchten, dass Instanzen ihre eigenen itemArray , sollten Sie diese in initialize oder im Konstruktor festlegen.

var ItemView = Backbone.View.extend({

  initialize: function() {
    this.itemArray = [];
  },

  ...

});

Hier ist eine Geige, die das tut, was Sie beschrieben haben: http://jsfiddle.net/XgPyH/32/

Hallo @braddunbar ,

Wir haben bereits dieselbe Lösung verwendet, die Sie als Problemumgehung veröffentlicht haben, aber es scheint, dass wir das nicht brauchen sollten. Es ist ziemlich verwirrend, findest du nicht?

Können Sie erklären, welchen Nutzen es für den Prototyp hat (ich verstehe nicht ganz, ich sage nicht, dass die aktuelle Implementierung falsch ist - ich versuche nur, eine Klarstellung zu bekommen, damit wir verstehen können).

Wir geben häufig alle Eigenschaften unserer Ansicht so an, wie @spawnedc sie in seiner Geige verwendet hat, da dann klar ist, welche Eigenschaften die Ansicht hat, wenn wir sie dann auch in der Initialisierungsmethode "überschreiben" müssen, was nur umständlich erscheint .

In den Beispiel-Apps werden die Ansichtseigenschaften genauso angegeben (siehe Todo.js). Eine "Vorlagen" -Variable wird auf die gleiche Weise angegeben, aber da es sich nur um eine unveränderliche Zeichenfolge handelt, wird dieses Problem natürlich nie auftreten.

Was ist der richtige Weg, um dynamische Ansichtseigenschaften anzugeben? Sicherlich müssen wir sie nicht alle in der init-Methode überschreiben ...?

Können Sie erklären, welchen Nutzen das für den Prototyp hat?

Das Einfügen veränderlicher Eigenschaften (Arrays, Hashes usw.) in den Prototyp ist meiner Erfahrung nach selten nützlich (obwohl ich sicher bin, dass es einige Fälle gibt, in denen dies der Fall ist).

Was ist der richtige Weg, um dynamische Ansichtseigenschaften anzugeben? Sicherlich müssen wir sie nicht alle in der init-Methode überschreiben ...?

Ja, um eine Eigenschaft mit einem veränderlichen Wert für jede Instanz einer Klasse / eines Konstruktors festzulegen, sollten Sie dies im Konstruktor tun (oder in diesem Fall initialize , der vom Konstruktor aufgerufen wird).

Auf diese Weise richtet Backbone beispielsweise Backbone.Model .

@braddunbar Wenn ich eine neue Instanz erstelle, alle Eigenschaften zurückgesetzt werden, da es sich um eine brandneue Instanz handelt. Ist das nicht das erwartete Verhalten oder fehlt mir etwas?

Hallo @braddunbar ,

Das Einfügen veränderlicher Eigenschaften (Arrays, Hashes usw.) in den Prototyp ist meiner Erfahrung nach selten nützlich (obwohl ich sicher bin, dass es einige Fälle gibt, in denen dies der Fall ist).

Ist das nicht genau das, was Bacbone in diesem Fall mit itemArray macht? itemArray befindet sich auf dem Prototyp, weshalb das Verhalten, das wir erleben, stattfindet?

Ich stimme der letzten Aussage von @spawnedc zu 100% zu. Ich würde nicht erwarten, dass Eigenschaften zwischen Instanzen von "Geschwister" -Ansichten geteilt werden.

Tatsächlich wird keine der Eigenschaften zurückgesetzt, es sei denn, sie werden im Konstruktor zurückgesetzt. Sie sind immer dieselben Prototyp-Eigenschaften, die von allen Instanzen gemeinsam genutzt werden, die vom selben Konstruktor erstellt wurden.

var A = function(){};
var a = new A();

var B = function(){};
B.prototype = a;
a.constructor = B;

var b1 = new B();
var b2 = new B();

console.log(b1.foo); // undefined
console.log(b2.foo); // undefined

a.foo = [1];

console.log(b1.foo); // [1]
console.log(b2.foo); // [1]

console.log(b1.foo === b2.foo); // true

Wenn Sie interessiert sind gibt es eine große Erklärung hier .

Ist das nicht genau das, was Bacbone in diesem Fall mit itemArray macht? itemArray befindet sich auf dem Prototyp, weshalb das Verhalten, das wir erleben, stattfindet?

Genau. Aus diesem Grund empfehle ich, itemArray in initialize anstatt als Prototyp-Eigenschaft zu erstellen.

@braddunbar Vielen Dank für die Erklärung und den Link - Einerseits ist es immer noch ein seltsames (und unerwartetes) Verhalten, andererseits ist es durchaus sinnvoll, die Eigenschaften zwischen Ansichten zu teilen.

Ich werde den JavaScript Garden-Artikel lesen und ich bin sicher, dass alles klar wird :).

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen