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' sievents
es 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: jsfiddlethis
versus 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.events
y, de loParentView.prototype.events
contrario, si ambos definen controladores en el mismo evento, el controlador del padre anulará el del hijo.{},ParentView.prototype.events,this.events
delegateEvents
se llama en el constructor para vincular eventos. Entonces, cuando lo extiendes en elinitialize
, ¿cómo es que no es demasiado tarde?initialize
en 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 laevents
fusió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
defaults
mé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
super
no me funcionaba, tampoco especificaba manualmente elParentView
clase o heredada.Acceso a la
_super
var 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.initialize
si 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
ParentView
tiene 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_.extend
directamente: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
attributes
ydefaults
.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í comodefaults
propiedades 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.