Почему в Extjs 4 не срабатывает мой запуск настраиваемого события om image?

Обновление 2: это подтверждает, что событие cpuchartclicked запускается, потому что предупреждение ('привет') работает. Что мне нужно, так это чтобы я мог отвечать на это событие в моем контроллере.

items: [
    {
        xtype: 'image',
        itemId: 'graphiteChartCPU',
        src: '',
        listeners:{
            'afterrender':function (comp) {
                comp.getEl().on('click', function (el) {
                    this.fireEvent('cpuchartclicked');
                }, this);
            },
            'cpuchartclicked':function () {
                alert('hello');
            }
        }
    }

]

Обновление: с помощью следующего я устанавливаю область действия для обработчика нажатия. Кажется, что fireEvent() работает сейчас, но все еще не слышит событие в контроллере.

items: [
    {
        xtype: 'image',
        itemId: 'graphiteChartCPU',
        src: '',
        listeners:{
            'afterrender':function (comp) {
                comp.getEl().on('click', function (el) {
                    alert('on click handler');
                    this.fireEvent('cpuchartclicked');
                }, this);
            }
        }
    }
]

// Listen Application Event
me.application.on({
    cpuchartclicked: me.onChartClicked,
    scope: me
});

Я пытаюсь запустить пользовательское событие на изображении, поэтому при нажатии на изображение контроллер слышит это событие.

Но я получаю сообщение об ошибке cmp.fireEvent() не функция?

items: [{
    xtype: 'image',
    itemId: 'graphiteChartCPU',
    src: '',
    listeners:{
        'afterrender':function (comp) {
        comp.getEl().on('click', function (el) {
        el.fireEvent('cpuchartclicked');
        });
        }
    }
}]

me.application.on({
    cpuchartclicked: this.onChartClicked,
    scope: this
});

3 ответа

Вы путаете Компоненты и Элементы. afterrender слушатель события устанавливается в компоненте изображения и получает сам компонент в качестве первого аргумента (который вы назвали el вместо неправильно).

Затем в afterrender слушатель, вы извлекаете основной элемент DOM для этого компонента, который оказывается <img> тег и установить click слушатель на объекте элемента, который является экземпляром Ext.dom.Element,

click подпись события не то, что вы ожидаете; первый аргумент Ext.util.Event объект, который не имеет fireEvent метод. Отсюда и ошибка.

Я бы посоветовал посмотреть подписи событий в документах перед их использованием. Также попробуйте добавить debugger оператор перед строкой, которая взорвется, и посмотрите, какие переменные передаются и что происходит. Использование отладчика Chrome или Firefox может быть очень полезным здесь.

Решил это, хотя мне интересно, если это лучший способ сделать это.

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

items: [
    {
        xtype: 'image',
        itemId: 'graphiteChartCPU',
        src: '',
        listeners:{
            'afterrender':function (comp) {
                comp.getEl().on('click', function (el) {
                    this.fireEvent('cpuchartclicked');
                }, this);
            }
        }
    }
]


'myContainer image':
{
    'cpuchartclicked': me.onChartClicked
}

Вы должны привязать элемент изображения следующим образом:

{
    xtype: 'image',
    itemId: 'graphiteChartCPU',
    src: '',
    listeners: {
      el: {
          click: function() {
          console.log("Click");
          }
      }
    }
}

это решит мою проблему в ext5

Другие вопросы по тегам