La documentación de Backbone dice:
La propiedad de eventos también se puede definir como una función que devuelve un hash de eventos, para facilitar la definición de sus eventos mediante programación, así como para heredarlos de las vistas principales.
¿Cómo hereda los eventos de vista de un padre y los extiende?
Vista principal
var ParentView = Backbone.View.extend({
events: {
'click': 'onclick'
}
});
Vista infantil
var ChildView = ParentView.extend({
events: function(){
????
}
});

parentEvents = _.result(ParentView.prototype, 'events');lugar de verificar 'manualmente' sieventses una función._.result, que no había notado antes. Para cualquiera que esté interesado, aquí hay un jsfiddle con un montón de variaciones sobre este tema: jsfiddlethisversus tener que llamar a la clase principal por el nombre de la instancia. Muchas gracias por esto.La respuesta de soldier.moth es buena. Simplificándolo aún más, podría hacer lo siguiente
Luego, simplemente defina sus eventos en cualquiera de las clases de la manera típica.
fuente
this.eventsy, de loParentView.prototype.eventscontrario, si ambos definen controladores en el mismo evento, el controlador del padre anulará el del hijo.{},ParentView.prototype.events,this.eventsdelegateEventsse llama en el constructor para vincular eventos. Entonces, cuando lo extiendes en elinitialize, ¿cómo es que no es demasiado tarde?initializeen algunos casos (luego tendrá que lidiar con la gestión de la jerarquía de esa función también) simplemente para fusionar los objetos de evento. Me parece más limpio mantener laeventsfusión dentro de sí mismo. Dicho esto, no habría pensado en este enfoque, y siempre es agradable verse obligado a ver las cosas de una manera diferente :)También puede utilizar el
defaultsmétodo para evitar crear el objeto vacío{}.fuente
Si usa CoffeeScript y establece una función en
events, puede usarsuper.fuente
¿No sería más fácil crear un constructor base especializado desde Backbone.View que maneje la herencia de eventos en la jerarquía?
Esto nos permite reducir (fusionar) los eventos en la jerarquía cada vez que creamos una nueva 'subclase' (constructor hijo) utilizando la función de extensión redefinida.
Al crear una vista especializada: BaseView que redefine la función de extensión, podemos tener subvistas (como AppView, SectionView) que quieran heredar los eventos declarados de su vista principal, simplemente hágalo extendiendo desde BaseView o uno de sus derivados.
Evitamos la necesidad de definir programáticamente nuestras funciones de eventos en nuestras subvistas, que en la mayoría de los casos necesitan referirse explícitamente al constructor padre.
fuente
Versión corta de la última sugerencia de @ soldier.moth:
fuente
Esto también funcionaría:
Usar directamente
superno me funcionaba, tampoco especificaba manualmente elParentViewclase o heredada.Acceso a la
_supervar que está disponible en cualquier coffeescriptClass … extends …fuente
http://danhough.com/blog/backbone-view-inheritance/
fuente
Para la versión 1.2.3 de Backbone,
__super__funciona bien e incluso puede estar encadenado. P.ej:... que - en
A_View.js- resultará en:fuente
Encontré soluciones más interesantes en este artículo.
Utiliza super de Backbone y hasOwnProperty de ECMAScript. El segundo de sus ejemplos progresivos funciona a las mil maravillas. Aquí hay un código:
También puede hacer eso para la interfaz de usuario y los atributos .
Este ejemplo no se ocupa de las propiedades establecidas por una función, pero el autor del artículo ofrece una solución en ese caso.
fuente
Para hacer esto completamente en la clase principal y admitir un hash de eventos basado en funciones en la clase secundaria para que los niños puedan ser independientes de la herencia (el niño tendrá que llamar
MyView.prototype.initializesi anulainitialize):fuente
Esta solución de CoffeeScript funcionó para mí (y tiene en cuenta la sugerencia de @ soldier.moth):
fuente
Si está seguro de que
ParentViewtiene los eventos definidos como objeto y no necesita definir eventos dinámicamenteChildView, es posible simplificar aún más la respuesta de soldier.moth al deshacerse de la función y usar_.extenddirectamente:fuente
Un patrón para esto que me gusta es modificar el constructor y agregar alguna funcionalidad adicional:
Prefiero este método porque no tienes que identificar al padre, una variable menos para cambiar. Utilizo la misma lógica para
attributesydefaults.fuente
Vaya, muchas respuestas aquí, pero pensé en ofrecer una más. Si usa la biblioteca BackSupport, ofrece
extend2. Si lo usaextend2, automáticamente se encarga de fusionarevents(así comodefaultspropiedades similares) por usted.He aquí un ejemplo rápido:
https://github.com/machineghost/BackSupport
fuente
extend2) fue lo mejor que se me ocurrió, y no creo que sea tan terrible: cualquiera que esté acostumbrado a Backbone ya está acostumbrado a usarloextend, por lo que de esta manera no necesita memorizar un nuevo comando.