Recentemente, comecei a aprender ExtJS e tenho problemas para entender como lidar com eventos. Não tenho experiência com nenhuma versão anterior do ExtJS.
Ao ler vários manuais, guias e páginas de documentação, descobri como usá-lo, mas não sei ao certo como funciona. Encontrei vários tutoriais para versões mais antigas do ExtJS, mas não tenho certeza de como eles são aplicáveis no ExtJS 4.
Eu estou olhando especificamente para a "palavra final" em coisas como
- Quais argumentos uma função de manipulação de eventos é passada? Existe um conjunto padrão de argumentos que sempre são aprovados?
- como definir eventos personalizados para componentes personalizados que escrevemos? como podemos disparar esses eventos personalizados?
- o valor de retorno (verdadeiro / falso) afeta como o evento borbulha? Caso contrário, como podemos controlar o evento borbulhando de dentro ou de fora do manipulador de eventos?
- existe uma maneira padrão de registrar ouvintes de eventos? (Encontrei duas maneiras diferentes até agora e não sei por que cada método foi usado).
Por exemplo, essa pergunta me leva a acreditar que um manipulador de eventos pode receber alguns argumentos. Eu já vi outros tutoriais em que existem apenas dois argumentos para o manipulador. O que muda?
javascript
extjs
event-handling
extjs4
jrharshath
fonte
fonte
Respostas:
Vamos começar descrevendo a manipulação de eventos dos elementos DOM.
Tratamento de eventos do nó DOM
Antes de tudo, você não gostaria de trabalhar diretamente com o nó DOM. Em vez disso, você provavelmente desejaria utilizar a
Ext.Element
interface. Com o objetivo de atribuir manipuladores de eventos,Element.addListener
eElement.on
(estes são equivalentes) foram criados. Então, por exemplo, se tivermos html:e queremos adicionar
click
manipulador de eventos.Vamos recuperar
Element
:Agora vamos verificar a documentação para o
click
evento. Seu manipulador pode ter três parâmetros:Conhecendo tudo isso, podemos atribuir manipulador:
Manipulação de evento de widgets
A manipulação de eventos de widgets é muito semelhante à manipulação de eventos de nós DOM.
Primeiro, a manipulação de eventos dos widgets é realizada utilizando o
Ext.util.Observable
mixin. Para lidar com os eventos corretamente, seu widget deve conterExt.util.Observable
um mixin. Todos os widgets integrados (como Painel, Formulário, Árvore, Grade, ...) têmExt.util.Observable
como combinação por padrão.Para widgets, existem duas maneiras de atribuir manipuladores. O primeiro - é usar no método (ou
addListener
). Vamos, por exemplo, criar umButton
widget e atribuir umclick
evento a ele. Antes de tudo, verifique os documentos do evento para obter os argumentos do manipulador:Agora vamos usar
on
:A segunda maneira é usar a configuração de listeners do widget :
Observe que o
Button
widget é um tipo especial de widget. O evento Click pode ser atribuído a este widget usandohandler
config:Disparo de eventos personalizados
Antes de tudo, você precisa registrar um evento usando o método addEvents :
O uso do
addEvents
método é opcional. Conforme comentam esse método, não há necessidade de usar esse método, mas fornece lugar para a documentação dos eventos.Para disparar seu evento, use o método fireEvent :
arg1, arg2, arg3, /* ... */
será passado para o manipulador. Agora podemos lidar com seu evento:Vale ressaltar que o melhor local para inserir a chamada do método addEvents é o
initComponent
método do widget quando você está definindo um novo widget:Evitando bolhas de eventos
Para evitar bolhas, você pode
return false
ou usarExt.EventObject.preventDefault()
. Para impedir a ação padrão do navegador, useExt.EventObject.stopPropagation()
.Por exemplo, vamos atribuir o manipulador de eventos click ao nosso botão. E se não clicar no botão esquerdo, impeça a ação padrão do navegador:
fonte
Acionando eventos abrangentes do aplicativo
Como fazer com que os controladores conversem entre si ...
Além da excelente resposta acima, quero mencionar eventos abrangentes do aplicativo, que podem ser muito úteis em uma configuração do MVC para permitir a comunicação entre controladores. (extjs4.1)
Digamos que temos uma estação controladora (exemplos do Sencha MVC) com uma caixa de seleção:
Quando a caixa de seleção aciona um evento de alteração, a função
onStationSelect
é acionada.Dentro dessa função, vemos:
Isso cria e dispara um evento amplo do aplicativo que podemos ouvir de qualquer outro controlador.
Assim, em outro controlador, agora podemos saber quando a caixa de seleção da estação foi alterada. Isso é feito ouvindo o
this.application.on
seguinte:Se a caixa de seleção foi alterada, agora também acionamos a função
onStationStart
no controladorSong
...Dos documentos do Sencha:
Eventos de aplicativo são extremamente úteis para eventos que possuem muitos controladores. Em vez de escutar o mesmo evento de exibição em cada um desses controladores, apenas um controlador escuta o evento de exibição e dispara um evento para todo o aplicativo que os outros podem ouvir. Isso também permite que os controladores se comuniquem sem conhecer ou depender da existência um do outro.
No meu caso: Clicar em um nó de árvore para atualizar dados em um painel de grade.
Atualize 2016 graças a @ gm2008 a partir dos comentários abaixo:
Em termos de acionamento de eventos personalizados em todo o aplicativo, agora existe um novo método após a publicação do ExtJS V5.1 , que está sendo usado
Ext.GlobalEvents
.Ao disparar eventos, você pode ligar para:
Ext.GlobalEvents.fireEvent('custom_event');
Ao registrar um manipulador do evento, você chama:
Ext.GlobalEvents.on('custom_event', function(arguments){/* handler codes*/}, scope);
Este método não está limitado aos controladores. Qualquer componente pode manipular um evento personalizado colocando o objeto de componente como o escopo do parâmetro de entrada.
Encontrado no Sencha Docs: MVC Parte 2
fonte
Ext.GlobalEvents.fireEvent('custom_event');
Quando você registra um manipulador do evento, ligaExt.GlobalEvents.on('custom_event', function(arguments){/* handler codes*/}, scope};
Aqui está um violino . Este método não está limitado aos controladores. Qualquer componente pode manipular um evento personalizado colocando o objeto de componente como parâmetro de entradascope
. A questão deve ser reaberta.Mais um truque para os ouvintes de eventos do controlador.
Você pode usar curingas para assistir a um evento de qualquer componente:
fonte
Só queria acrescentar um pouco de importância às excelentes respostas acima: Se você está trabalhando no Extjs 4.1 e não possui eventos abrangentes de aplicativos, mas precisa deles, estou usando uma técnica muito simples que pode ajudar: objeto simples estendendo o Observable e defina todos os eventos de aplicativo necessários. Em seguida, você pode disparar esses eventos de qualquer lugar no seu aplicativo, incluindo o elemento dom html real e ouvi-los a partir de qualquer componente, retransmitindo os elementos necessários desse componente.
Então você pode, de qualquer outro componente:
E dispare-os a partir de qualquer componente ou elemento dom:
fonte
Apenas mais duas coisas que achei úteis saber, mesmo que não façam parte da pergunta, realmente.
Você pode usar o
relayEvents
método para instruir um componente a escutar determinados eventos de outro componente e, em seguida, acioná-los novamente como se fossem originários do primeiro componente. Os documentos da API fornecem o exemplo de uma grade que retransmite oload
evento da loja . É bastante útil ao escrever componentes personalizados que encapsulem vários subcomponentes.Por outro lado, ou seja, passar eventos recebidos por um componente encapsulante
mycmp
para um de seus subcomponentessubcmp
, pode ser feito assimfonte