A documentação do Backbone afirma:
A propriedade events também pode ser definida como uma função que retorna um hash de eventos, para tornar mais fácil definir programaticamente seus eventos, bem como herdá-los das visualizações pai.
Como você herda os eventos de visão de um pai e os amplia?
Visão parental
var ParentView = Backbone.View.extend({
events: {
'click': 'onclick'
}
});
Visão infantil
var ChildView = ParentView.extend({
events: function(){
????
}
});
parentEvents = _.result(ParentView.prototype, 'events');
vez de 'manualmente' verificar seevents
é uma função._.result
, que eu não tinha notado antes. Para quem estiver interessado, aqui está um jsfiddle com um monte de variações sobre este tema: jsfiddlethis
versus ter que chamar a classe pai pelo nome da instância. Muito obrigado por isso.A resposta do soldado.moth é boa. Simplificando ainda mais, você poderia apenas fazer o seguinte
Em seguida, apenas defina seus eventos em qualquer classe da maneira típica.
fonte
this.events
&ParentView.prototype.events
caso contrário, se ambos definirem manipuladores no mesmo evento, o manipulador do Pai substituirá o do filho.{},ParentView.prototype.events,this.events
delegateEvents
é chamado no construtor para vincular eventos. Então, quando você estende isso noinitialize
, por que não é tarde demais?initialize
em alguns casos (então tendo que lidar com o gerenciamento da hierarquia dessa função também) simplesmente para mesclar os objetos de evento. Parece mais limpo para mim manter aevents
fusão dentro de si. Dito isso, eu não teria pensado nessa abordagem e é sempre bom ser forçado a ver as coisas de uma maneira diferente :)Você também pode usar o
defaults
método para evitar a criação do objeto vazio{}
.fonte
Se você usar CoffeeScript e definir uma função para
events
, poderá usarsuper
.fonte
Não seria mais fácil criar um construtor de base especializado em Backbone.View que lida com a herança de eventos na hierarquia?
Isso nos permite reduzir (mesclar) os eventos hash abaixo na hierarquia sempre que criamos uma nova 'subclasse' (construtor filho) usando a função de extensão redefinida.
Ao criar uma visão especializada: BaseView que redefine a função extender, podemos ter subvisualizações (como AppView, SectionView) que desejam herdar os eventos declarados de sua visão pai simplesmente estendendo de BaseView ou um de seus derivados.
Evitamos a necessidade de definir programaticamente nossas funções de evento em nossas subvisualizações, que na maioria dos casos precisam se referir ao construtor pai explicitamente.
fonte
Versão resumida da última sugestão de @ soldier.moth:
fonte
Isso também funcionaria:
Usar straight
super
não estava funcionando para mim, era especificar manualmente aParentView
classe herdada ou.Acesso ao
_super
var que está disponível em qualquer coffeescriptClass … extends …
fonte
http://danhough.com/blog/backbone-view-inheritance/
fonte
Para Backbone versão 1.2.3,
__super__
funciona bem e pode até ser encadeado. Por exemplo:... que - em
A_View.js
- resultará em:fonte
Eu encontrei soluções mais interessantes neste artigo
Ele usa o super do Backbone e o hasOwnProperty do ECMAScript. O segundo de seus exemplos progressivos funciona perfeitamente. Aqui está um pequeno código:
Você também pode fazer isso para interface do usuário e atributos .
Este exemplo não cuida das propriedades definidas por uma função, mas o autor do artigo oferece uma solução nesse caso.
fonte
Para fazer isso inteiramente na classe pai e oferecer suporte a um hash de eventos baseado em função na classe filha para que os filhos possam ser agnósticos quanto à herança (o filho terá que chamar
MyView.prototype.initialize
se isso substituirinitialize
):fonte
Esta solução CoffeeScript funcionou para mim (e leva em consideração a sugestão de @ soldier.moth):
fonte
Se você tem certeza de que
ParentView
tem os eventos definidos como objeto e não precisa definir eventos dinamicamenteChildView
, é possível simplificar ainda mais a resposta do soldier.moth livrando-se da função e usando_.extend
diretamente:fonte
Um padrão para isso de que gosto é modificar o construtor e adicionar algumas funcionalidades adicionais:
Prefiro esse método porque você não precisa identificar o pai - uma variável a menos para alterar. Eu uso a mesma lógica para
attributes
edefaults
.fonte
Uau, muitas respostas aqui, mas pensei em oferecer mais uma. Se você usar a biblioteca BackSupport, ela oferece
extend2
. Se você usá-extend2
lo, automaticamente cuidará da mesclagemevents
(bem como dedefaults
propriedades semelhantes) para você.Aqui está um exemplo rápido:
https://github.com/machineghost/BackSupport
fonte
extend2
) foi o melhor que eu consegui inventar, e eu não acho que seja tão terrível assim: qualquer pessoa acostumada com o Backbone já está acostumada a usarextend
, então assim não precisa memorizar um novo comando.