backbone.js - l'accès à un modèle à partir d'un événement de clic
J'ai un BoardView contenant un CellCollection de CellModels. Je extraire la collection de la db et de créer ensuite le CellViews.
Tout cela fonctionne à merveille jusqu'à ce que je tente d'accéder à un CellModel par l'intermédiaire d'un événement de clic sur le BoardView. Je ne peux pas obtenir à la sous-jacentes des modèles de... seulement les points de vue. Est-il un moyen de faire cela?
J'ai tenté d'inclure dans le code ci-dessous:
CellModel = Backbone.Model.extend({});
CellCollection = Backbone.Collection.extend({
model : CellModel
});
CellView = Backbone.View.extend({
className : 'cell',
});
BoardView = Backbone.View.extend({
this.model.cells = new CellCollection();
render : function() {
this.cellList = this.$('.cells');
return this;
},
allCells : function(cells) {
this.cellList.html('');
this.model.cells.each(this.addCell);
return this;
},
addCell : function(cell) {
var view = new Views.CellView({
model : cell
}).render();
this.cellList.append(view.el);
},
events : {
'click .cell' : 'analyzeCellClick',
},
analyzeCellClick : function(e) {
//?????????
}
});
J'ai besoin de le clic pour "arriver" sur le BoardView, pas la CellView, parce qu'elle implique la carte logique spécifique.
OriginalL'auteur cosmo_kramer | 2011-09-21
Vous devez vous connecter pour publier un commentaire.
Je ne peux penser à au moins deux approches, vous pouvez utiliser ici:
Passer le BoardView à la CellView lors de l'initialisation, puis de gérer l'événement dans le CellView:
Ce serait le travail, mais je préfère ne pas avoir de vues appel des uns et des autres méthodes, comme il les rend plus étroitement couplées.
Fixer le CellModel id pour les DOM quand vous le rendre:
C'est probablement un peu plus propre, en ce qu'elle évite le couplage mentionné ci-dessus, mais je pense que de toute façon serait de travailler.
Grand - si vous êtes satisfait de la réponse, vous pouvez l'accepter en cliquant sur la case à cocher en dessous du score :).
La Solution 2, à mon avis, n'est pas une bonne idée. Le point de l'ensemble de la Dorsale est de récupérer les données depuis le serveur, et l'afficher dans la vue du client, et de ne pas obtenir les données à partir de la vue et de l'envoyer en arrière. Cela fonctionne, mais ce n'est pas une belle façon.
OriginalL'auteur nrabinowitz
Bonne question! Je pense que la meilleure solution serait de mettre en place un
de coordonner tous les événements entre les différents domaines de votre application.
Prendre ce chemin semble propre, faiblement couplé, facile à mettre en œuvre, extensible et il est en fait suggéré par l'épine dorsale de la documentation, voir Épine Dorsale Docs
Veuillez en lire plus sur le sujet ici et ici car (même si j'ai essayé dur), mon explication est médiocre pour moi.
Cinq étapes explication:
Créer un EventBus dans votre main ou ailleurs, comme un util et include ou require il
Ajouter un ou plusieurs de rappel hanlder(s)
Ajouter un déclencheur pour l'Eventlistener de votre childView (ici: la CellView)
Ajouter un Écouteur à la fonction d'initialisation de votre parentView (ici: la BoardView)
Définir le correspondant de Rappel à l'intérieur de votre parentView (et l'ajouter à votre _.bindAll)
OriginalL'auteur Bruiser
Je laisserais le
CellView
gérer l'événement de clic, mais ce sera juste déclencher une épine Dorsale de l'événement:Merci @blunderboy!
cette approche semble plus cohérent avec la façon dont je comprends comment épine Dorsale est censé fonctionner. ou je me trompe?
OriginalL'auteur sntran