是否真的所有 ExtJS 组件都没有点击事件

Posted

技术标签:

【中文标题】是否真的所有 ExtJS 组件都没有点击事件【英文标题】:Is there really no click event for all ExtJS components 【发布时间】:2012-08-16 15:02:15 【问题描述】:

我正在学习 extjs 4.1,但我在大多数组件上都找不到点击事件 - 我是瞎子还是无法对按钮以外的其他组件的点击做出反应?

是什么原因? html 支持点击所有元素。

【问题讨论】:

需要点击事件的组件有buttons这样的事件。您具体指的是哪些组件? 面板、组合框...每个具有图形表示的组件都需要点击事件 点击面板和组合框由 ExtJS 在内部处理,因为 ExtJS 定义了用户点击面板(其标题、工具按钮等)或组合框时发生的各种行为或其触发器。您是否将其与还有 click 事件的 dom 元素混淆了? 我没有混淆任何东西 - 为什么我不能将自己的句柄用于也由 ExtJS 处理的事件? 这是因为 ExtJS 组件不会解析为单个 dom 元素。事实上,它可以由几十个这些组成。所以点击面板并没有完全定义——点击在哪里?关于内容?在标题栏上?在工具栏上?页脚?可调整大小布局中的拖动处理程序? ExtJS 组件需要响应各种点击事件来完成它们的任务。您可以随时点击 dom 元素事件单击,就像您接受的答案一样。 【参考方案1】:

每个组件都可以在元素级别公开点击事件。像Ext.button.Button 这样的一些组件在组件级别有一个点击事件。

这是在面板上添加点击事件的好方法:

  new Ext.panel.Panel(
      listeners: 
          click: this.handlePanelClick,
          element: 'el'
      
  );

编辑以回复评论

元素字符串是作为组件属性的任何元素。

new Ext.panel.Panel(
listeners: 
    click: function() 
        alert('you clicked the body');
    ,
    element: 'body'

);

Ext 文档有更详尽的解释http://docs.sencha.com/ext-js/4-1/#!/api/Ext.util.Observable-method-addListener

【讨论】:

此配置中元素参数的其他选项是什么?【参考方案2】:

您可以通过访问几乎所有可见组件在渲染后包含的Ext.dom.Element 对象来轻松添加任何DOM 事件。

只需向afterrender 事件添加一个侦听器,即可将您想要的事件添加到 dom 对象。

Ext.create('Ext.panel.Panel', 
    // other panel configs ...
    listeners: 
       'afterrender': function(panel) 
           panel.el.on('click', function() 
               alert('clicked');
           );
        
    
);

我认为还有一种方法可以对扩展Ext.util.Observable 的类的所有组件(所有可见组件)执行此操作。我以前没做过,所以你必须玩弄它。

【讨论】:

【参考方案3】:

使用自引用托管侦听器(最干净的 imo):

Ext.create('Ext.panel.Panel', 
    listeners: 
       'afterrender': function(panel) 
           this.mon(this.getEl(), 'click', this.onClick, this)
        
    ,
    onClick: function() 
        alert("mmm mon mon mon");
    
);

【讨论】:

我很好奇你为什么认为这是最干净的。这似乎也是对mon 的滥用。 mon 用于在项目被销毁时移除监听器,因为当组件被销毁时元素将被销毁,它在这里没有做任何额外的事情。 你在想mun(删除托管侦听器的简写) 嗯,不,来自文档:mon addManagedListener Adds listeners to any Observable object (or Ext.Element) which are automatically removed when this Component is destroyed.的简写【参考方案4】:

如果你只听点击事件,你也可以这样做

    xtype: 'container',
    listeners: 
         el: 
             click: function() 
                  alert('I clicked');
              ,
              scope: this
             
     

如果您需要侦听 Ext.dom.Element 不触发的事件,您需要将其附加到“渲染”侦听器中,就像其他人建议的那样。

【讨论】:

以上是关于是否真的所有 ExtJS 组件都没有点击事件的主要内容,如果未能解决你的问题,请参考以下文章

ExtJs页面 有啥方法可以让combobox的store每次点击时都加载一次??

extjs 4.2.1 - 工具栏和将点击事件委托给按钮

是否可以在没有点击事件及其方法的情况下使用服务将数据从一个组件传递到另一个组件?

React Native知识5-Touchable类组件

如何在 Extjs 4 标签上添加点击事件

Ext JS:窗口子组件隐藏事件