Как прикрепить обработчик событий к панели в extJS?

все, что я хочу сделать, это обрабатывать щелчок на панели extJS.

я пробовал все предложения на этот вопрос плюс все, что я мог найти в другом месте, но каждый из них не способами, описанными ниже.

каков правильный синтаксис для добавления обработчика событий click в панель extJS?

[редактировать: ради других, кто может найти этот вопрос позже, я добавлю некоторые комментарии встроены, чтобы сделать это проще расшифровать --@bmoeskau]

не выполняет обработчик:

var menuItem1 = new Ext.Panel({
    id: 'panelStart',
    title: 'Start',
    html: 'This is the start page.',
    cls:'menuItem',
    listeners: {
        click: function() {
            alert('ok');
        }
    }
}); 

[Ed:click не является событием панели]

не выполняет обработчик:

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: панель никогда не отображается -- add renderto config. Затем вы нажмете нулевую ошибку, сообщив вам, что c не действительной переменной. Вы имеете в виду menuItem1 вместо?]

не выполнять обработчик:

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 не является событием панели. Кроме того, панель еще не отображена, поэтому, если вы переключили обратный вызов на элемент, а не на компонент, вы получите ошибку null.]

получает ошибку: Ext.get ('panelStart') равно 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: он не отображается, см. выше. Переключение с getCmp to get означает, что вы переключаетесь с ссылки на Component (который существует, но не имеет click событие) в ссылок Element (который имеет click событие, но еще не оказанных/действует).]

делает панель исчезнет:

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: область, передаваемая в обратный вызов (content) не является допустимым ref в этом коде (это было неправильно вставлено из другого образца). Так как панель var создается как menuItem1 и обратный вызов предназначен для запуска в области панели, область VAR должна быть menuItem1. Кроме того, эта панель не отображается, см. предыд комментарии.]

дает ошибку " Ext.fly (menuItem1.id) равно 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: панель не отображается, см. выше]

...поставить снаружи внутр.onReady()... возвращает ошибку: Ext.getCmp ('panelStart') имеет значение null

Ext.getCmp('panelStart').on('click', function() {
    alert('okoutside');
});

[Ed: панель, вероятно, не отображается во время выполнения этого кода. Кроме того,click не является событием панели.]

...поставить снаружи внутр.onReady()... возвращает ошибку: Ext.get ('panelStart') является значение null

Ext.get('panelStart').on('click', function() {
    alert('okoutside');
});

[Ed: см. выше]

...поставить снаружи внутр.onReady()... возвращает ошибку: Ext.fly ('panelStart') равно null

Ext.fly('panelStart').on('click', function() {
    alert('okoutside');
});

[Ed: см. выше]

за последние три, я проверил в Firebug и :

alt text

он работает с JQuery:

поэтому с JQuery я просто должен это сделать, и это работает:

$('body').delegate(('#panelStart'), 'click', function(){
    alert('ok with jquery');
});

[Ed: это не очень хороший подход. Это просто отсрочка. присоединение обработчика до тех пор, пока элемент фактически не появится в DOM (что также может быть сделано через Ext btw, но все равно не будет правильным подходом). Я изложил правильный подход, как указано в моем ответе ниже. Все попытки операции очень близки, но в каждой отсутствует одна или две ключевые части.]

как я могу прикрепить обработчик щелчка, как это с extJS?

4 ответов


[для тех, кто еще читает это, я прошел через достаточно подробное объяснение этого уже здесь.]

вам не хватает нескольких ключевых понятий:

click is не допустимое событие панели, поэтому добавление обработчика щелчка на панели ничего не сделает (это проблема в большинстве кода, который вы опубликовали выше).

в этом коде:

var menuItem1 = new Ext.Panel({
   ...
}); 
content.body

вы скопировали с другого ответа, но неправильно. content в другом код ссылается на созданную панель - это переменная. В этом коде вы создали панель как menuItem1 а потом пытаются ссылаться на него, как content?

пожалуйста, перечитайте мое предыдущее объяснение о том, как работает рендеринг в другом ответе, который я дал вам. Вы должны либо добавьте панель в контейнер, который ее отображает,или сделать это напрямую (через renderTo config). Если вы не сделаете ни того, ни другого, панель не появится.

используя функция делегата jQuery -не правильный подход с компонентами Ext JS.


попробуйте это:

var menuItem1 = new Ext.Panel({
    id: 'panelStart',
    title: 'Start',
    html: 'This is the start page.',
    cls:'menuItem',
    listeners: {
        afterrender: function (comp) {
            var element = comp.getEl();
            element.on('click', function() {
                alert('ok')
            });
        }
    }
}); 

если вы хотите слушать события на Ext.Элементы внутри панели, вы используете element собственность при вызове addListener или передав listeners config, вместо того, чтобы ждать afterrender событие просто набор слушателей

var menuItem1 = new Ext.Panel({
    id: 'panelStart',
    title: 'Start',
    html: 'This is the start page.',
    cls:'menuItem',
    listeners: {
        click: {
           element: 'el', // could be 'body', or any other Ext.Elements 
                          // that are available from the component
           fn: function() {}
        }
    }
}); 

или более простой подход:

    listeners: { 'expand': {fn: adminSelected }}