40 votes

Backbone.js: l'événement "changement" de la collection ne se déclenche pas

J'ai une jolie collection simple, mais je n'arrive pas à lier, c'est de modifier l'événement. Dans google Chrome, console, je suis en cours d'exécution:

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?

Puisque c'est une de ces choses qui peuvent être difficiles à repérer, je doute que quelqu'un sait sur le dessus de leur tête ce qui se passe (si oui, génial!). Donc, je vais poser deux questions:

  1. Si le code ci-dessus œuvre comme prévu?
  2. Si oui, avez-vous des suggestions sur la façon de traquer où ce serait un échec?

Merci

68voto

soldier.moth Points 8996

L' change événement n'est déclenché lorsque l'une des collections les modèles sont modifiés. Lorsqu'un modèle est ajouté à la collection de l' add événement est déclenché.
Voir Backbone.js' Documents De La Collection:

Vous pouvez lier "changement" des événements pour être averti lorsqu'un modèle dans l' la collection a été modifiée, écouter pour "ajouter" et "supprimer" événements[...]

Pour écouter lorsqu'un add se modifier votre code pour être

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

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

11voto

timDunham Points 2893

Non, cela ne fait que déclencher l'événement "add". Cela déclenchera l'événement de changement si vous procédez comme suit:

 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"});
 

10voto

Chris Dutrow Points 8662

Si vous voulez savoir quand quelque chose d'important a été fait avec une collection, ce sont les événements que vous voulez probablement écouter: change add remove reset

En ce qui concerne votre exemple, voici à quoi pourrait ressembler votre code:

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

5voto

bababooey Points 338

Cela peut ne pas être nécessaire dans la plupart des cas, mais vous pouvez déclencher manuellement un événement de modification sur votre objet / collection:

 object.trigger("change");
 

1voto

Gaurav Gupta Points 2107

Je ne le trouve documenté nulle part, mais l'événement "tous" se déclenche sur toutes les actions, y compris l'ajout, la suppression et la modification.

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X