La documentation de Backbone indique:
La propriété events peut également être définie comme une fonction qui renvoie un hachage d'événements, pour faciliter la définition par programme de vos événements, ainsi que pour les hériter des vues parent.
Comment héritez-vous des événements d'affichage d'un parent et comment les étendez-vous?
Vue parent
var ParentView = Backbone.View.extend({
events: {
'click': 'onclick'
}
});
Vue enfant
var ChildView = ParentView.extend({
events: function(){
????
}
});
parentEvents = _.result(ParentView.prototype, 'events');
au lieu de vérifier «manuellement» sievents
c'est une fonction._.result
, que je n'avais pas remarquée auparavant. Pour tous ceux qui sont intéressés, voici un jsfiddle avec un tas de variations sur ce thème: jsfiddlethis
devoir appeler la classe parente par nom d'instance. Merci beaucoup pour cela.La réponse du soldat.moth est bonne. En simplifiant davantage, vous pouvez simplement faire ce qui suit
Ensuite, définissez simplement vos événements dans l'une ou l'autre classe de la manière habituelle.
la source
this.events
etParentView.prototype.events
sinon, si les deux définissent des gestionnaires sur le même événement, le gestionnaire du parent remplacera celui de l'enfant.{},ParentView.prototype.events,this.events
delegateEvents
est appelé dans le constructeur pour lier des événements. Alors, quand vous le prolongez dans leinitialize
, pourquoi il n'est pas trop tard?initialize
dans quelques cas (puis à gérer la hiérarchie de cette fonction également) simplement pour fusionner les objets événement. Cela me semble plus propre de garder laevents
fusion en elle-même. Cela étant dit, je n'aurais pas pensé à cette approche, et c'est toujours agréable d'être obligé de regarder les choses d'une manière différente :)Vous pouvez également utiliser la
defaults
méthode pour éviter de créer l'objet vide{}
.la source
Si vous utilisez CoffeeScript et définissez une fonction sur
events
, vous pouvez utilisersuper
.la source
Ne serait-il pas plus facile de créer un constructeur de base spécialisé à partir de Backbone.View qui gère l'héritage des événements dans la hiérarchie.
Cela nous permet de réduire (fusionner) le hachage des événements dans la hiérarchie chaque fois que nous créons une nouvelle 'sous-classe' (constructeur enfant) en utilisant la fonction d'extension redéfinie.
En créant une vue spécialisée: BaseView qui redéfinit la fonction d'extension, nous pouvons avoir des sous-vues (comme AppView, SectionView) qui souhaitent hériter des événements déclarés de leur vue parente, faites-le simplement en étendant à partir de BaseView ou de l'un de ses dérivés.
Nous évitons la nécessité de définir par programme nos fonctions d'événement dans nos sous-vues, qui dans la plupart des cas doivent faire référence explicitement au constructeur parent.
la source
Version courte de la dernière suggestion de @ soldier.moth:
la source
Cela fonctionnerait également:
Utiliser straight
super
ne fonctionnait pas pour moi, c'était non plus spécifier manuellement leParentView
classe ou héritée.Accès au
_super
var qui est disponible dans n'importe quel coffeescriptClass … extends …
la source
http://danhough.com/blog/backbone-view-inheritance/
la source
Pour Backbone version 1.2.3,
__super__
fonctionne très bien et peut même être enchaîné. Par exemple:... ce qui - en
A_View.js
- entraînera:la source
J'ai trouvé des solutions plus intéressantes dans cet article
Il utilise le super du Backbone et le hasOwnProperty d'ECMAScript. Le deuxième de ses exemples progressifs fonctionne comme un charme. Voici un peu un code:
Vous pouvez également le faire pour l' interface utilisateur et les attributs .
Cet exemple ne prend pas en charge les propriétés définies par une fonction, mais l'auteur de l'article propose une solution dans ce cas.
la source
Pour faire cela entièrement dans la classe parent et prendre en charge un hachage d'événements basé sur une fonction dans la classe enfant afin que les enfants puissent être indépendants de l'héritage (l'enfant devra appeler
MyView.prototype.initialize
s'il remplaceinitialize
):la source
Cette solution CoffeeScript a fonctionné pour moi (et prend en compte la suggestion de @ soldier.moth):
la source
Si vous êtes sûr que les
ParentView
événements sont définis comme objet et que vous n'avez pas besoin de définir les événements dynamiquement,ChildView
il est possible de simplifier davantage la réponse de soldier.moth en supprimant la fonction et en utilisant_.extend
directement:la source
Un modèle pour cela que j'aime beaucoup est la modification du constructeur et l'ajout de fonctionnalités supplémentaires:
Je préfère cette méthode car vous n'avez pas à identifier la variable parent-one less pour changer. J'utilise la même logique pour
attributes
etdefaults
.la source
Wow, beaucoup de réponses ici mais je pensais en offrir une de plus. Si vous utilisez la bibliothèque BackSupport, elle propose
extend2
. Si vous l'utilisez,extend2
il s'occupe automatiquement de la fusionevents
(ainsi quedefaults
des propriétés similaires) pour vous.Voici un exemple rapide:
https://github.com/machineghost/BackSupport
la source
extend2
) a été le meilleur que j'ai pu proposer, et je ne pense pas que ce soit si terrible: quiconque est habitué à Backbone est déjà habitué à utiliserextend
, donc de cette façon, ils n'ont pas besoin de mémoriser une nouvelle commande.