Wie befestige ich einen event-handler auf ein panel in extJS?
Alles was ich tun möchte ist Griff, ein Klick auf ein extJS panel.
Ich habe versucht, alle Vorschläge auf diese Frage plus alle die ich finden konnte, anderswo aber jeder von Ihnen scheitern in der nachstehend beschriebenen Weise.
Was ist die korrekte syntax zum hinzufügen eine click-Ereignis-handler zu einem extJS panel?
[Bearbeiten: Für das wohl der anderen, die finden, diese Frage später, ich ' ll fügen Sie einige inline-Kommentare, um diese einfacher zu entschlüsseln --@bmoeskau]
nicht ausführen handler:
var menuItem1 = new Ext.Panel({
id: 'panelStart',
title: 'Start',
html: 'This is the start page.',
cls:'menuItem',
listeners: {
click: function() {
alert('ok');
}
}
});
[Ed: click
ist nicht eine Panel-Veranstaltung]
nicht ausführen handler:
var menuItem1 = new Ext.Panel({
id: 'panelStart',
title: 'Start',
html: 'This is the start page.',
cls:'menuItem',
listeners: {
render: function(c) {
c.body.on('click', function() {
alert('ok');
});
}
}
});
[Ed: Das Panel wird nie gerendert -- add renderTo config. Als Nächstes treffen Sie eine null-Fehler-sagen Sie, dass c
ist keine gültige variable. Meinst du menuItem1
statt?]
nicht ausführen handler:
var menuItem1 = new Ext.Panel({
id: 'panelStart',
title: 'Start',
html: 'This is the start page.',
cls:'menuItem'
});
Ext.getCmp('panelStart').on('click', function() {
alert('ok');
});
[Ed: click
ist nicht eine Panel-Veranstaltung. Auch das Panel ist noch nicht erbracht, so dass, wenn Sie eingeschaltet, der Rückruf auf das element, anstatt die Komponente, die Sie bekommen würde, eine null-Fehler.]
wird Fehler: Ext.get('panelStart') ist null:
var menuItem1 = new Ext.Panel({
id: 'panelStart',
title: 'Start',
html: 'This is the start page.',
cls:'menuItem'
});
Ext.get('panelStart').on('click', function() {
alert('ok');
});
[Ed: Es ist nicht dargestellt, siehe oben. Wechsel von getCmp
zu get
bedeutet, dass Sie den Wechsel von verweisen auf die Component
(die nicht vorhanden ist, aber nicht ein click
Ereignis) zu verweisen auf die Element
(die eine click
Ereignis, aber noch nicht gerendert/gilt).]
ist das panel verschwinden:
var menuItem1 = new Ext.Panel({
id: 'panelStart',
title: 'Start',
html: 'This is the start page.',
cls:'menuItem',
listeners: {
'render': {
fn: function() {
this.body.on('click', this.handleClick, this);
},
scope: content,
single: true
}
},
handleClick: function(e, t){
alert('ok');
}
});
[Ed: Umfang weitergegeben, in der Rückruf (content
) ist keine gültige ref in diesem code (das war copy-eingefügt fälschlicherweise aus einer anderen Stichprobe). Da die Panel-var erstellt, wie menuItem1
und der callback ausgeführt werden soll, in das panel-scope, scope var sollte menuItem1
. Auch dieses Fenster ist nie gerendert, siehe Vorherige Kommentare.]
gibt die Fehlermeldung "Ext.Fliegen(menuItem1.id) is null":
var menuItem1 = new Ext.Panel({
id: 'panelStart',
title: 'Start',
html: 'This is the start page.',
cls:'menuItem'
});
Ext.fly(menuItem1.id).addListener('click', Ext.getCmp(menuItem1.id) , this);
[Ed: Panel ist nicht gerendert, siehe oben]
...vor die Tür gesetzt Ext.onReady()...
wird Fehler: Ext.getCmp('panelStart') ist null
Ext.getCmp('panelStart').on('click', function() {
alert('okoutside');
});
[Ed: Panel ist wahrscheinlich nicht gerendert an der Zeit, dieser code ausgeführt wird. Auch click
ist nicht eine Panel-Veranstaltung.]
...vor die Tür gesetzt Ext.onReady()...
wird Fehler: Ext.get('panelStart') ist null
Ext.get('panelStart').on('click', function() {
alert('okoutside');
});
[Ed: Siehe oben]
...vor die Tür gesetzt Ext.onReady()...
wird Fehler: Ext.Fliegen('panelStart') ist null
Ext.fly('panelStart').on('click', function() {
alert('okoutside');
});
[Ed: Siehe oben]
Für die letzten drei, überprüfte ich in Firebug und <div id="startPanel">
vorhanden ist:
Es funktioniert mit JQuery:
Also mit JQuery habe ich einfach dazu und es funktioniert:
$('body').delegate(('#panelStart'), 'click', function(){
alert('ok with jquery');
});
[Ed: ist Dies nicht ein guter Ansatz. Es ist einfach die Verzögerung anbringen der handler erst später, wenn das element tatsächlich zeigt sich in den DOM (und das kann auch getan werden, über Ext btw, würde aber trotzdem nicht der richtige Ansatz). Ich buchstabierte den richtigen Ansatz, wie verknüpft in meiner Antwort weiter unten. Die OP ' s versuche sind alle sehr eng, aber jeder der fehlen ein oder zwei key-pieces.]
Wie kann ich die befestigen Sie einen click-Ereignishandler wie diese mit extJS?
- Komisch. Ich habe versucht, Ihr Dritter Versuch (mit "c.Körper.auf") und es funktioniert gut. Sind Sie sicher, dass das panel tatsächlich rendering in den ersten Platz??? Ein paar Tipps, der erste Versuch wird nicht funktionieren, weil Sie auf ist nicht ein gültiges Ereignis auf einer Tafel. Ich kann deutlich sehen, die syntax-Fehler im zweiten Versuch zu.
Du musst angemeldet sein, um einen Kommentar abzugeben.
[Für jemand anderes dies Lesen, ich ging durch eine ziemlich Gründliche Erklärung dieser bereits hier.]
Fehlen Ihnen ein paar wichtige Begriffe:
click
ist nicht eine gültige Panel-Veranstaltung, so dass das hinzufügen eine click-handler auf ein Panel wird sich nichts tun (das ist das Problem in den meisten der code, den Sie oben gepostet).In diesem code:
Sie Kopie-aufgeklebt von einer anderen Antwort, aber falsch.
content
im anderen code referenziert das Panel erstellt wurde-es ist eine variable. In diesem code, den Sie erstellt das Panel, das alsmenuItem1
aber dann versuchen, zu verweisen, alscontent
?Bitte Lesen Sie nochmals meine Vorherige Erklärung darüber, wie das Rendern funktioniert auch in die andere Antwort, die ich Ihnen gab. Sie muss entweder fügen Sie einem Panel ein container, der macht es, oder machen, es direkt (über die
renderTo
config). Wenn Sie weder das Panel wird nicht angezeigt.Mithilfe von jQuery delegieren Funktion ist nicht der richtige Ansatz mit Ext JS-Komponenten.
myPanel.body.on('click', ...);
ist der richtige Ansatz, so stellen Sie sicher, dass das panel gerendert wird, bevor es zu tun.menuItem1.header is undefined
Fehler aber nur, wenn ich würde menuItem1 in einem accordion-layout, das ist der trick besteht darin, diemenuItem1.header.on('click',...)
NACH der definition des Akkordeon-layout, da nur dann die menuItem1 existieren, vielen Dank für die Klärung dieser.listeners: {click:{element: 'body, fn: function(){}'}}
versuchen Sie dies:
renderTo
oder durch hinzufügen zu einem container, der macht es. Auch dieafterrender
code ist nicht wirklich ein sehr guter Ansatz zur Lösung dieses Problems.myPanel.body.on('click', ...)
wo myPanel bereits erbracht wurde. Beachten Sie, dass dies könnte in der render - /afterrender Rückruf zu, als Sie zeigen.Wenn Sie möchten, zu hören, zu Veranstaltungen, auf Ext.- Elemente in einem panel, verwenden Sie die
element
- Eigenschaft beim AufrufaddListener
oder übergabe inlisteners
config, anstatt zu warten, für dieafterrender
Fall nur um die ZuhörerOder ein einfacher Ansatz: