Expliquer la gestion des événements ExtJS 4
j'ai récemment commencé à apprendre les ExtJS, et j'ai du mal à comprendre comment gérer les événements. Je n'ai aucune expérience de toutes les versions antérieures de ExtJS.
en lisant divers manuels, guides et pages de documentation, j'ai compris comment l'utiliser, mais je ne sais pas trop comment cela fonctionne. J'ai trouvé plusieurs tutoriels pour les anciennes versions D'ExtJS, mais je ne suis pas sûr qu'ils soient applicables dans ExtJS 4.
je regarde spécifiquement la finale mot "sur des choses comme
- quels arguments une fonction de gestion d'événements passe-t-elle? Est-il d'une série d'arguments qui sont toujours passés?
- comment définir des événements personnalisés pour les composants personnalisés nous écrire? Comment Pouvons-nous lancer cet événement personnalisé?
- la valeur de retour (vrai/faux) affectent la façon dont l'événement bulles? Si ce n'est pas le cas, comment pouvons-nous contrôler le bouillonnement d'événements à l'intérieur ou à l'extérieur du gestionnaire d'événements?
- existe-t-il un moyen standard d'enregistrer les auditeurs d'événements? (Je suis tombé sur deux façons différentes jusqu'à maintenant, et je ne suis pas sûr pourquoi chaque méthode a été utilisée).
par exemple, cette question me porte à croire qu'un gestionnaire d'événements peut recevoir pas mal d'arguments. J'ai vu d'autres tutoriels où il n'y a que deux arguments pour le handler. Quels sont les changements?
5 réponses
commençons par décrire la gestion des événements de DOM elements.
nœud DOM la gestion des événements
tout d'abord, vous ne voudriez pas travailler directement avec DOM node. Au lieu de cela, vous voudriez probablement utiliser Ext.Element
interface. Dans le but d'assigner des gestionnaires d'événements, Element.addListener
et Element.on
(ils sont équivalents) ont été créés. Donc, pour exemple, si nous avons html:
<div id="test_node"></div>
et nous voulons ajouter click
gestionnaire d'événement.
Récupérons Element
:
var el = Ext.get('test_node');
vérifions maintenant docs pour click
événement. Son gestionnaire peut avoir trois paramètres:
, cliquez sur( Ext.EventObject e, HTMLElement t, Object eOpts )
sachant tout cela choses que nous pouvons assigner handler:
// event name event handler
el.on( 'click' , function(e, t, eOpts){
// handling event here
});
Widgets gestion des événements
La gestion D'événementsWidgets est assez similaire à la gestion D'événements DOM nodes.
tout d'abord, widgets event handling est réalisé en utilisant Ext.util.Observable
mixin. Afin de gérer les événements correctement votre widget doit contenir Ext.util.Observable
comme un mixin. Tous les widgets intégrés (comme panneau, Forme, Arbre, grille,...) avoir Ext.util.Observable
comme mixin par défaut.
pour les widgets il y a deux façons d'assigner des gestionnaires. La première - est d'utiliser sur méthode (ou addListener
). Créons par exemple Button
widget et assignons click
événement à elle. Tout d'abord, vous devriez vérifier les docs de l'événement pour les arguments de handler:
, cliquez sur( Ext.bouton.Ce bouton, l'Événement e, Objet eOpts )
maintenant, utilisons on
:
var myButton = Ext.create('Ext.button.Button', {
text: 'Test button'
});
myButton.on('click', function(btn, e, eOpts) {
// event handling here
console.log(btn, e, eOpts);
});
la deuxième façon est d'utiliser les écouteurs "de widget 1519380920" config:
var myButton = Ext.create('Ext.button.Button', {
text: 'Test button',
listeners : {
click: function(btn, e, eOpts) {
// event handling here
console.log(btn, e, eOpts);
}
}
});
notez que Button
widget est un type spécial de widgets. Click event peut être assigné à ce widget en utilisant handler
config:
var myButton = Ext.create('Ext.button.Button', {
text: 'Test button',
handler : function(btn, e, eOpts) {
// event handling here
console.log(btn, e, eOpts);
}
});
des événements Personnalisés de tir
tout d'Abord, vous devez enregistrer un événement en utilisant addEvents méthode:
myButton.addEvents('myspecialevent1', 'myspecialevent2', 'myspecialevent3', /* ... */);
La méthode , qui utilise la méthode addEvents
, est facultative. Comme les commentaires à cette méthode disent qu'il n'est pas nécessaire d'utiliser cette méthode, mais elle fournit une place pour la documentation des événements.
mettre le feu À votre cas d'utilisation fireEvent la méthode:
myButton.fireEvent('myspecialevent1', arg1, arg2, arg3, /* ... */);
arg1, arg2, arg3, /* ... */
sera passé à handler. Maintenant nous pouvons gérer votre événement:
myButton.on('myspecialevent1', function(arg1, arg2, arg3, /* ... */) {
// event handling here
console.log(arg1, arg2, arg3, /* ... */);
});
il est intéressant de noter que le meilleur endroit pour insérer addEvents appel de méthode est widget initComponent
méthode Lorsque vous définissez nouveau widget:
Ext.define('MyCustomButton', {
extend: 'Ext.button.Button',
// ... other configs,
initComponent: function(){
this.addEvents('myspecialevent1', 'myspecialevent2', 'myspecialevent3', /* ... */);
// ...
this.callParent(arguments);
}
});
var myButton = Ext.create('MyCustomButton', { /* configs */ });
prévenir les bulles d'événements
pour éviter les bulles vous pouvez return false
ou utiliser Ext.EventObject.preventDefault()
. Afin d'empêcher l'action par défaut du navigateur utiliser Ext.EventObject.stopPropagation()
.
par exemple, assignons click event handler à notre bouton. Et si non bouton gauche a été cliqué empêcher l'action par défaut du navigateur:
myButton.on('click', function(btn, e){
if (e.button !== 0)
e.preventDefault();
});
Tir de l'application des événements à l'échelle
Comment faire pour que les contrôleurs de parler les uns aux autres ...
en plus de la très grande réponse ci-dessus, je tiens à mentionner des événements d'application large qui peuvent être très utiles dans une configuration MVC pour permettre la communication entre les contrôleurs. (extraits 4.1)
disons que nous avons une station de contrôle (exemples MVC Sencha) avec une boîte de sélection:
Ext.define('Pandora.controller.Station', {
extend: 'Ext.app.Controller',
...
init: function() {
this.control({
'stationslist': {
selectionchange: this.onStationSelect
},
...
});
},
...
onStationSelect: function(selModel, selection) {
this.application.fireEvent('stationstart', selection[0]);
},
...
});
Lorsque la boîte de sélection déclenche un événement de changement, la fonction onStationSelect
est déclenché.
dans cette fonction nous voyons:
this.application.fireEvent('stationstart', selection[0]);
cela crée et déclenche un événement d'application large que nous pouvons écouter de n'importe quel autre contrôleur.
ainsi, dans un autre contrôleur, nous pouvons maintenant savoir quand la case station select a été changée. Ceci est fait en écoutant this.application.on
comme suit:
Ext.define('Pandora.controller.Song', {
extend: 'Ext.app.Controller',
...
init: function() {
this.control({
'recentlyplayedscroller': {
selectionchange: this.onSongSelect
}
});
// Listen for an application wide event
this.application.on({
stationstart: this.onStationStart,
scope: this
});
},
....
onStationStart: function(station) {
console.info('I called to inform you that the Station controller select box just has been changed');
console.info('Now what do you want to do next?');
},
}
si la selectbox a été modifiée, nous activons maintenant la fonction onStationStart
dans le contrôleur Song
...
De la Sencha docs:
les événements D'Application sont extrêmement utiles pour les événements qui ont de nombreux contrôleurs. Au lieu d'écouter pour le même événement de vue dans chacun de ces controllers, un seul controller écoute pour l'événement de vue et déclenche une application-large l'événement que les autres peuvent écouter. Cela permet également aux contrôleurs de communiquer entre eux sans savoir ou en fonction de l'existence de l'autre.
dans mon cas: cliquer sur un noeud d'arbre pour mettre à jour les données dans un panneau de grille.
mise à Jour en 2016 grâce à @gm2008 les commentaires ci-dessous:
en termes de mise à feu des événements personnalisés à l'échelle de l'application, il y a une nouvelle méthode maintenant après ExtJS V5.1 est publié, qui utilise Ext.GlobalEvents
.
quand vous tirez des événements, vous pouvez appeler: Ext.GlobalEvents.fireEvent('custom_event');
Lorsque vous enregistrez un gestionnaire de l'événement, vous appelez: Ext.GlobalEvents.on('custom_event', function(arguments){/* handler codes*/}, scope);
cette méthode ne se limite pas aux contrôleurs. N'importe quel component peut gérer un événement personnalisé en mettant l'objet component comme le paramètre d'entrée scope.
un truc de plus pour les écouteurs d'événements du contrôleur.
vous pouvez utiliser des jokers pour surveiller un événement de n'importe quel composant:
this.control({
'*':{
myCustomEvent: this.doSomething
}
});
je voulais juste ajouter quelques pence aux excellentes réponses ci-dessus.: Si vous travaillez sur pre Extjs 4.1, et que vous n'avez pas d'événements d'application mais que vous en avez besoin, j'ai utilisé une technique très simple qui pourrait aider: Créez un objet simple extensible Observable, et définissez tous les événements de l'application dont vous pourriez avoir besoin. Vous pouvez ensuite lancer ces événements à partir de n'importe où dans votre application, y compris l'élément HTML dom réel et les écouter à partir de n'importe quel composant en relayant les éléments requis de ce composant.
Ext.define('Lib.MessageBus', {
extend: 'Ext.util.Observable',
constructor: function() {
this.addEvents(
/*
* describe the event
*/
"eventname"
);
this.callParent(arguments);
}
});
alors vous pouvez, de tout autre composant:
this.relayEvents(MesageBus, ['event1', 'event2'])
et de les tirer de tout composant ou élément dom:
MessageBus.fireEvent('event1', somearg);
<input type="button onclick="MessageBus.fireEvent('event2', 'somearg')">
juste deux autres choses que j'ai trouvé utiles à savoir, même si elles ne font pas partie de la question, vraiment.
vous pouvez utiliser la méthode relayEvents
pour dire à un composant d'écouter certains événements d'un autre composant et de les tirer à nouveau comme s'ils provenaient du premier composant. Les docs API donnent l'exemple d'une grille relayant l'événement store load
. Il est très pratique pour écrire des composants personnalisés qui encapsulent plusieurs sous-composants.
l'inverse, c'est-à-dire la transmission d'événements reçus par un composant d'encapsulation mycmp
à l'un de ses sous-composants subcmp
, peut se faire comme ceci
mycmp.on('show' function (mycmp, eOpts)
{
mycmp.subcmp.fireEvent('show', mycmp.subcmp, eOpts);
});