Как мне прикрепить обработчик событий к панели в extJS? - PullRequest
7 голосов
/ 19 ноября 2010

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

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

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

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

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

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

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

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

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: TheПанель никогда не отображается - добавьте 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');
});

[Ред .: click не является событием Panel.Кроме того, Panel еще не отображается, поэтому, если вы переключите функцию обратного вызова на элемент, а не на Компонент, вы получите нулевую ошибку.]

получает ошибку: 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 на 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');
    }        
}); 

[Ред .: Область, передаваемая в обратный вызов (content), не является допустимым указателемв этом коде (это было неправильно скопировано из другого примера).Поскольку переменная Panel создается как menuItem1 и обратный вызов предназначен для запуска в области видимости панели, область видимости должна быть 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);

[Ред .: Панель не являетсяотображается, см. выше]

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

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

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

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

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

[Ред .: см. Выше]

... помещается за пределы Ext.onReady () ... получает ошибку: Ext.fly ('panelStart') равен нулю

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

[Ред .: См. Выше]

Последние три я проверил в Firebug и <div id="startPanel"> существует:

alt text

Работает с JQuery:

Так что с JQuery я просто должен сделать это, и это работает:

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

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

Как я могу прикрепить обработчик кликов, подобный этому, к extJS?

Ответы [ 4 ]

7 голосов
/ 19 ноября 2010

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

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')
            });
        }
    }
}); 
6 голосов
/ 19 ноября 2010

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

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

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

В этом коде:

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

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

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

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

2 голосов
/ 16 августа 2012

Если вы хотите прослушивать события в Ext.Elements внутри панели, вы используете свойство element при вызове addListener или передаче конфигурации listeners вместо ожидания события 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() {}
        }
    }
}); 
0 голосов
/ 11 августа 2014

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

    listeners: { 'expand': {fn: adminSelected }} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...