webentwicklung-frage-antwort-db.com.de

Backbone.js: Das "change" -Ereignis der Sammlung wird nicht ausgelöst

Ich habe eine ziemlich einfache Sammlung, aber ich kann nicht scheinen, an sein Änderungsereignis zu binden. In der Chrome-Konsole wird Folgendes ausgeführt:

var c = new AwesomeCollection();
c.bind("change", function(){
  console.log('Collection has changed.');
});

c.add({testModel: "Test"}); // Shouldn't this trigger the above log statement?

Da dies eines der Dinge ist, die schwierig aufzuspüren sind, bezweifle ich, dass irgendjemand genau weiß, was los ist (wenn ja, großartig!). Also stelle ich zwei Fragen:

  1. Sollte der obige Code wie erwartet funktionieren?
  2. Wenn ja, haben Sie Vorschläge, wie Sie feststellen können, wo dies fehlschlagen würde?

Vielen Dank

40
Thomas

Das Ereignis change wird nur ausgelöst, wenn eines der Modelle der Auflistungen geändert wird. Wenn der Sammlung ein Modell hinzugefügt wird, wird das Ereignis add ausgelöst.
Siehe Backbone.js ' Sammlungsdokumentation :

Sie können "Änderungs" -Ereignisse binden, um benachrichtigt zu werden, wenn ein Modell in der Sammlung geändert wurde. Warten Sie auf "Hinzufügen" - und "Entfernen" -Ereignisse [...]

Um abzuhören, wann ein add auftritt, ändern Sie Ihren Code auf

var c = new AwesomeCollection();
c.bind("add", function(){
  console.log('Collection has changed.');
});

c.add({testModel: "Test"}); 
68
soldier.moth

Nein, das löst nur das Ereignis "add" aus. Es wird das Änderungsereignis auslösen, wenn Sie dies tun:

var c = new AwesomeCollection();
c.bind("change", function() {
  console.log('Collection has changed.');
});

var model = new Backbone.Model({testModel: "Test"});
c.add(model);
model.set({testModel: "ChangedTest"});
11
timDunham

Wenn Sie wissen möchten, wann mit einer Sammlung etwas von Bedeutung geschehen ist, möchten Sie diese Ereignisse wahrscheinlich hören: change add remove reset

In Bezug auf Ihr Beispiel könnte Ihr Code folgendermaßen aussehen:

var c = new AwesomeCollection();
c.bind('change add remove reset', function(){
    console.log('Collection has changed.');
});
10
Chris Dutrow

In den meisten Fällen ist dies möglicherweise nicht erforderlich. Sie können jedoch ein Änderungsereignis für Ihr Objekt/Ihre Sammlung manuell auslösen:

object.trigger("change");
5
Chicowitz

Ich finde es nirgendwo dokumentiert, aber das "all" -Ereignis wird bei allen Aktionen ausgelöst, einschließlich Hinzufügen, Entfernen und Ändern.

var c = new AwesomeCollection();
c.bind("all", function(){
  console.log('Something happened');
});

c.add({testModel: "Test"}); 
1
Gaurav Gupta

Ich hoffe, AwesomeCollection ist eine BackboneCollection.

var AwesomeCollection = new Backbone.Collection();

AwesomeCollection.bind('add', function() {
    console.log('new object in the collection');
});

AwesomeCollection.add({something});

Dies sollte Ihr Ereignis auslösen. Wenn nicht, gibt es woanders ein anderes Problem.

Bearbeiten: Die Änderung kann nicht beim Hinzufügen eines Ereignisses ausgelöst werden, wie andere gesagt haben.

0
malletjo

Ich hatte das gleiche Problem wie auf Ihrem Backbone 0.5.3.

In der Backbone.Collection.reset () -Implementierung (die nach einem fetch () aufgerufen wird, wenn Sie keine optionale Eigenschaft "add" angeben), Zeile 503 bis 511:

// When you have more items than you want to add or remove individually,
// you can reset the entire set with a new list of models, without firing
// any `added` or `removed` events. Fires `reset` when finished.
reset : function(models, options) {
  models  || (models = []);
  options || (options = {});
  this.each(this._removeReference);
  this._reset();
  this.add(models, {silent: true});
  if (!options.silent) this.trigger('reset', this, options);
  return this;
},

2 Dinge sind hier wichtig:

  this.add(models, {silent: true});

dies bedeutet, dass Sie kein "Hinzufügen" -Ereignis ausgelöst haben.

Zweitens ist die:

  if (!options.silent) this.trigger('reset', this, options);

Das heißt, wenn Sie Ihren Code durch Folgendes ersetzen:

var c = new AwesomeCollection();
c.bind("reset", function(){
  console.log('Collection has changed.');
}

c.add({testModel: "Test"}); // Shouldn't this trigger the above log statement?

Es sollte funktionieren (hat bei mir funktioniert)

0
Frédéric

Wir können es auch nicht anhand Ihres Beispiels erkennen, aber für eine Sammlung muss die Modelleigenschaft definiert sein, wenn Sie Modelle hinzufügen möchten, indem Sie einfach ein Objekt übergeben. Andernfalls müssen Sie eine Modellinstanz übergeben, um () hinzuzufügen.

0
maxl0rd