注册活动仅适用于第一次

时间:2013-06-17 18:05:51

标签: extjs

我有一个窗口,里面有一个面板。该面板包含文本(基本html)。窗口准备好后,我调用以下函数,该函数查找具有特定类的元素,并在其上注册单击事件。这首先起作用。

关闭窗口并重新创建1:1类似窗口后,事件将不会触发。如果我.update()面板并重新运行我的函数也会发生同样的事情 - 事件无法触发。 为什么会这样?

我仍然可以看到找到的元素,显然必须注册一些事件,但调试代码或接收函数无法捕获我的点击。

addEvents: function(win) {
    // The Window
    var ow = win;

    // Using this debug trick I can see that on the second time the events wont fire
    // -- nothing gets printed to console 
    Ext.util.Observable.capture(ow, function(){
        console.log(arguments);
    });

    // Will search for elements, finds elements that have class myclass
    // In my case the elements are just ordinary html tags in the visible content
    // area of the panel.
    var elems = ow.down('panel').getEl().select(".myclass").elements;

    Ext.Array.forEach(elems, function (item, index, allItems) {
        // We need Ext DOM element to be able to attach stuff to it
        var elem = new Ext.dom.Element(item);
        elem.on ('click', function (evt, el, o) {
            ow.fireEvent('myevent', ow, elem);
        });
    });
}

我起初怀疑我必须实际取消注册以前的事件并销毁窗口,所以我尝试将其添加到窗口的 close 中:

    window.down('panel').destroy();
    window.destroy();

然而,我似乎还有其他一些我无法理解的问题。

1 个答案:

答案 0 :(得分:1)

这是一种非常JQuery的添加事件的方法。您正在处理组件,并应在组件上添加事件侦听器。如果您需要将事件委托给html元素,那么您需要在Component上设置一个封装元素的单个事件监听器,并将委托配置添加到实际的html元素中。

以下是一些资源: Explain ExtJS 4 event handling

活动代表团解释说: http://www.sencha.com/blog/event-delegation-in-sencha-touch(也适用于extjs)

有关extjs的监听器的更多信息:https://stackoverflow.com/a/8733338/834424