0

Dans mon projet Backbone.js, j'ai un modèle et plusieurs vues. Toutes les vues ont enregistré callbacks pour 'change:currentTextTitle' sur ce modèle:N'appelez pas render() si la vue elle-même a été mise à jour Modèle via Backbone.Model.set()

// 'this' stands for any of the Views here 
myModel.on('change:currentTextTitle', this.render, this); 

Maintenant, un utilisateur effectue une action, ce qui provoque la vue spécifique de changer son champ « titre actuel texte ». Cette vue spécifique appelle ensuite myModel.set("currentTextField", newTextValue) qui à son tour déclenche l'événement 'change:currentTextTitle' appelant tous les affichages (y compris celui dont set() est originaire). Puis tous les affichages appellent leurs fonctions de rappel render.

Le problème est que la méthode render est également appelée sur la vue à partir de laquelle la méthode set() a été appelée à l'origine, ce qui est complètement inutile car elle est déjà mise à jour avec currentTextTitle.

Comment mes vues appeler myModel.set() d'une manière que les autres les callbacks de Vues s'informer, mais sans déclencher/appeler lui-même « Voir source »?

Une solution semble être de passer la vue source dans le cadre du paramètre options de la méthode set() (qui obtient transmis à trigger() puis le long de la callback render()):

myModel.set("currentTextField", newTextValue, thisViewSetAttribute) 

Puis, dans la Rappel render on pourrait vérifier si thisViewSetAttribute != this. Cependant, au lieu d'implémenter des contrôles dans chaque rappel, je pense qu'il serait plus logique de gérer cela dans le modèle en appelant seulement les callbacks nécessaires et en ignorant la vue source à partir de laquelle l'appel à la méthode set() est apparu. Est-ce possible?

Répondre

1

Je pense que la solution MCV 'appropriée' est que vos vues ne devraient pas savoir ou se soucier de la façon dont le modèle a changé, elles devraient simplement gérer le changement et mettre à jour en conséquence. Si elles sont déjà en cours, l'utilisateur ne devrait pas connaître la différence.

Je ne transmettrais définitivement pas la vue source au modèle. Au lieu de cela, lorsque le modèle change, vous pouvez simplement voir si l'affichage est actuel et ne pas être rendu. Mais si le rendu supplémentaire ne cause aucun problème, alors laissez-le se produire :)

Dans Backbone, la 'vue' est à la fois vue et contrôleur. Donc, essayez de traiter le changement en deux étapes distinctes. Tout d'abord, convertissez l'entrée de l'utilisateur en modifications sur le modèle, puis en tant qu'étape séparée (initiée par l'événement de changement de modèle), gérez cette modification et mettez à jour la vue. Si chaque vue le fait, peu importe la façon dont le modèle change, tout restera à jour.

Questions connexes