Délégation d'événements pour un parent de la vue de la colonne vertébrale
Mon point de vue, TuneBook
, a plusieurs enfants sont des vues de type ClosedTune
. J'ai aussi séparé plein de pages vues pour chaque morceau, OpenTune
. Les mêmes événements sont liés dans ClosedTune
et OpenTune
, j'ai donc conçu mon application de telle sorte qu'ils héritent d'une "abstrait" afficher Tune
.
Pour rendre mon application plus évolutive, je voudrais que les événements pour chaque ClosedTune
être déléguée à TuneBook
, mais pour la maintenabilité, je voudrais que les gestionnaires de mêmes (ceux qui sont stockés dans Tune
) pour être utilisé par TuneBook
(bien qu'ils avaient de toute évidence besoin d'être enveloppé dans une fonction).
Le problème que j'ai est, dans TuneBook
, trouver le bon ClosedTune
à l'appel du gestionnaire. Ce qui est une bonne façon d'architecte, ou existe-il d'autres bonnes solutions pour la délégation d'événements à un parent?
Note - pas un doublon de Épine dorsale de Vue: Hériter et d'étendre les événements du parent (qui est sur les enfants héritent d'une classe mère, alors que je pose la question au sujet des enfants qui sont les nœuds enfants du parent dans les DOM)
Tune
pourquoi vous voulez faire le détour ChildView -> ParentView -> Model
.. vous pouvez exécuter la Model.handler
directement à partir de la ChildView
.. En revanche, vous pouvez utiliser le Model
que le messager: vous pouvez modifier l'état du Modèle à partir de la ChildView et de laisser le ParentView à l'écoute de cette modification.C'est beaucoup moins efficace pour lier les événements (peut-être que je devrais être clair, je veux dire DOM événements plutôt que de l'épine Dorsale des événements personnalisés) pour chaque enfant de la vue du nœud DOM plutôt qu'une seule fois à la vue parent du nœud DOM. Sur les 300 ligne de la table générée par mes performances de l'application est sensiblement lent lors de la liaison directement à chaque ligne. Ce dont j'ai besoin est
ParentView -> [childView] -> childModel
OriginalL'auteur wheresrhys | 2012-05-07
Vous devez vous connecter pour publier un commentaire.
Dans votre vue parent (s'étendant également à partir de
Backbone.Events
), je voudrais lieronEvent
pour les événements DOM. Sur la gâchette, il mettrait le feu à une épine dorsale de l'événement, y compris quelques attribut "id" de votre enfant vues savez (sans doute certains d'id de ligne?).Les vues enfant serait alors naturellement vous abonner à la mère de vues événement qui les concerne. Ci-dessous je le fais dans
initialize
passage de la vue parent ainsi que de spécial attribut id que vous avez utilisé avant d'enoptions
.Vous pouvez bien sûr également mis en place similaire abonnés sur
Tune
ouOpenTune
.Cela semble parfait. Va l'essayer ce soir
Je l'ai fait presque à l'identique, avec la seule modification que j'ai attaché
ClosedTune
's des écouteurs d'événement au sein de la addOne() la méthode deTuneBook
a) d'éviter d'avoir à passer des références à des parents b) de permettre l'utilisation deClosedTune
dans d'autres contextesPeut-on transmettre des données sur le clic?
OriginalL'auteur ggozad
Ici sont un couple de possibilités.
1. Centralisé: magasin
ClosedTune
objets dans leTuneBook
instanceStocker une référence à chaque
ClosedTune
danstune_book.tunes
. Comment vous remplirtune_book.tunes
est à vous; puisque vous avez mentionné un additionneur méthode surTuneBook
, c'est ce que j'ai illustré ci-dessous.Dans le
TuneBook
gestionnaire d'événements, de récupérer laClosedTune
detune_book.tunes
en utilisant quelque chose comme laid
attribut de la cible de l'événement comme la clé. Ensuite, appelez leTune
ouClosedTune
gestionnaire.http://jsfiddle.net/p5QMT/1/
2. Décentralisée: associer le point de vue de l'objet avec l'objet DOM à l'aide de
jQuery.data()
Lorsque vous créez un
ClosedTune
, magasin de référence, par exemplethis.$el.data('view_object', this)
.Dans l'écouteur d'événement, de récupérer la
ClosedTune
, par exemple$(event.target).data('view_object')
.Vous pouvez utiliser exactement le même gestionnaire pour
ClosedTune
(enTuneBook
) etOpenTune
, si vous le souhaitez.http://jsfiddle.net/jQZNF/1/
Réponse au commentaire de
Je suppose que cela dépend de quel type de ménage /synchronisation vous vous sentez le besoin de le faire, et pourquoi.
Pourquoi pensez-vous que vous "devez supprimer le point de vue de tunebook de la liste de points de vue"? (Je ne dis pas que vous ne devriez pas, juste de se demander pourquoi vous le voulez). Depuis que vous faites, comment pensez-vous @ggozad approche se distingue à cet égard?
Les deux techniques store
ClosedTune
objets dans leTuneBook
instance. Dans @ggozad de la technique, il est juste caché derrière une couche d'abstraction qui rend peut-être moins évident pour vous.Dans mon exemple, elles sont stockées dans un simple objet JS (
tune_book.tunes
). Dans @ggozad elles sont stockées dans la_callbacks
structure utilisée parBackbone.Events
.L'ajout d'un
ClosedTune
:1.
2.
Si vous voulez vous débarrasser d'un
ClosedTune
(dites que vous le supprimer du document avectune.remove()
et vous voulez le point de vue de l'objet disparu complètement), à l'aide de @ggozad devra laisser un orphelin de référence pour laClosedTune
danstune_book._callbacks
, sauf si vous effectuez le même genre de ménage qui aurait du sens avec l'approche que je propose:1.
2.
La première ligne de chaque exemple est facultatif, selon si vous voulez nettoyer les
ClosedTune
objets ou pas.Bien, au final, il revient à votre préférence quant à la façon de structurer les choses. Si vous préférez stocker les objets de vue plus centralisé de la mode, vous pouvez les stocker dans le
TuneBook
exemple au lieu d'utiliserjQuery.data
. Voir #1: Centralisé.D'une manière ou d'une autre vous êtes stocker les références à la
ClosedTune
objets: à l'aide dejQuery.data
, ou dans un objet ordinaire dans leTuneBook
, ou dans_callbacks
dans leTuneBook
.Si vous aimez @ggozad de l'approche pour des raisons que vous comprenez, allez-y, mais c'est pas de la magie. Comme il est présenté ici, je ne suis pas sûr de ce parti est censé être assuré par l'augmentation du niveau d'abstraction par rapport à la plus simple, la version que je présente en #1. Si il y a un certain avantage, n'hésitez pas à me remplir.
Je ne sais pas si elle a été un facteur dans votre sélection, mais j'ai corrigé les erreurs stupides qui ont été dans mon précédent exemples de code. J'ai mis à jour ma réponse avec une réponse à votre commentaire (voir la section "Réponse à un commentaire").
Bravo pour la approfondie de la réponse. C'est vrai qu'il est facile de voir les événements comme une balle magique que vaguement les couples d'objets, sans inconvénients, et vous avez raison, je devrais donner plus d'attention à l'declutternig les rappels lors de la suppression d'objets. Néanmoins, des événements est encore mon option préférée. Avoir le double de références à la vue disparaît sent plus propre et moins tentant pour moi ou par d'autres développeurs à une mauvaise utilisation. Comme pour l'utilisation de $.les données que je suis toujours méfier de l'utilisation de tout ce qui interroge les DOM, sauf si absolument nécessaire que DOM interactions sont relativement lentes.
tentant pour moi ou par d'autres développeurs à l'utilisation abusive" - pas sûr de ce que vous voulez dire ici. "Comme pour l'utilisation de $.de données ..." -- je pense que vous ne comprenez pas ce que
jQuery.data()
. Vous ne spécifiez pas ce que vous utilisez réellement oùev.some_id_attr
apparaît dans votreclickHandler
, donc je suppose que vous êtes en utilisant une propriété d'un objet DOM, vous avez accès à ce point, par exemple,ev.target.id
.jQuery.data()
n'est pas un DOM opération, il utilise juste une propriété d'un objet DOM (par exempleev.target
) comme une clé de lecture de données à partir d'un objet JS. L'appel dethis.trigger()
fait la même chose -- lit les données à partir d'un objet JS.OriginalL'auteur JMM
Grands solution que j'ai prise à partir de cette l'article (@dave-cadwallader commentaire).
Étendre un général de l'épine dorsale des événements de l'objet et de le stocker dans une référence
vent
:Passer à la vue parente:
La vue enfant va déclencher un événement:
Et la vue parent est à l'écoute de l'enfant de l'événement:
Avertissement - attention que les
vent
objet doit être injecté à chaque affichage de sorte que vous trouverez dans cet article une meilleure conception de modèles de faire usage de.OriginalL'auteur Shahar Shokrani