【问题标题】:How to add row double click event listener when extending grid panel with Ext.define()?使用 Ext.define() 扩展网格面板时如何添加行双击事件监听器?
【发布时间】:2011-08-10 17:34:09
【问题描述】:

我正在使用 Ext.define() (Ext v4) 扩展 GridPanel。

我需要在双击网格行时获取行数据。在这一点上,我什至无法让事件监听器工作:

Ext.define('Application.usersGrid', {
extend: 'Ext.grid.GridPanel',
alias: 'widget.usersgrid',


viewConfig: {
    listeners: {
        dblclick: function(dataview, index, item, e) {
            alert('dblclick');
        }
    }
},
...

这里有什么问题?

如果有人需要答案-这是正确的方法:

Ext.define('Application.usersGrid', {
extend: 'Ext.grid.Panel',
alias: 'widget.usersgrid',


viewConfig: {
    listeners: {
        itemdblclick: function(dataview, record, item, index, e) {
            alert('itemdblclick');
        }
    }
},
...

http://dev.sencha.com/new/ext-js/4-0/api/Ext.grid.GridView#event-itemdblclick

【问题讨论】:

  • 监听器是否应该是 GridPanel 或 SelectonModel 的一部分,您将其隐藏在 viewConfig 中
  • 我正在关注这篇文章:hutten.org/bill/extjs/2011/03/…

标签: javascript extjs gridpanel extjs4


【解决方案1】:

您不需要将侦听器放在 viewconfig 中。这是我的工作配置:

listeners : {
    itemdblclick: function(dv, record, item, index, e) {
        alert('working');
    }
},

另一件事是,您似乎在扩展属性中使用了Ext.grid.GridPanel。但在文档中它是Ext.grid.Panel。但即使使用网格面板,一切似乎都运行良好。

我建议使用 Ext JS 4 术语,因为它可能会在以后的其他 4.x 版本中导致应用程序损坏。

现在,如果您使用新的 MVC 架构,您将希望将这些操作移至控制器而不是视图。详情可以参考 MVC 架构指南。

【讨论】:

  • 感谢您的提示 - 它也适用于我。将我的代码更改为 exctend grid.Panel。我正在关注hutten.org/bill/extjs/2011/03/… 的示例,它正在使用 viewConfig.. 也许我遗漏了什么?
  • @Petrunov,你并没有错过什么......我认为 hutten.org 的作者犯了一个错误“在 ExtJS 4.0 中,你需要通过“viewConfig”来监听 GridPanel 视图上的事件“……这是错误的……
  • 顺便说一句,我尝试自己将侦听器直接添加到面板中,但没有奏效 - 也许是因为我尝试使用像 'dblclick' 和 'rowdblclick' 这样的事件 - 找不到' itemdblclick' 我自己:/
  • @Edo.. 我认为你有一些误解。你在哪里读到“在 ExtJS 4.0 中你需要通过 viewConfig 来监听 GridPanel 视图上的事件”?查看文档中 View 和 Panel 的事件。
  • @Petrunov,是的..这可能是它不适合你的原因。在 viewconfig 中使用 itemdbclick 尝试您的代码并让我们知道结果...
【解决方案2】:

使用 ExtJS 4 中的 MVC 方法,还有另一种聪明的方法来定义此类处理程序。一些示例代码:

Ext.define('App.controller.Documents', {

  extend: 'Ext.app.Controller',
  stores: ['Documents'],
  models: ['Document'],
  views: [
    'document.List',
    'document.Edit',
    'document.Preview'
  ],  

  init: function() {

    this.control({

      /*  
       * a cool way to select stuff in ExtJS 4
       */
      'documentlist': {
        itemdblclick: this.editDocument
      },  

      /*  
       * simple access to components
       */
      'documentedit button[action=save]': {
        click: this.updateDocument
      },  

    }); 

  },  

  editDocument: function(grid, record) {
    var view = Ext.widget('documentedit');
    view.down('form').loadRecord(record);
  },  

  updateDocument: function(button) {
    var win = button.up('window'),  // new selection API
        form   = win.down('form'),  // in ExtJS 4
        record = form.getRecord(),
        values = form.getValues();

    record.set(values);
    win.close();
  }
});

【讨论】:

  • 使用这种方法,你如何处理覆盖监听器?我的意思是,如果您在this 线程上遇到问题怎么办?
【解决方案3】:
listeners: {
        select: 'xxxx',

        itemdblclick: function (dv, record, item, index, e) {
            var myBtn = Ext.getCmp('btnEdit');
            myBtn.onClick();
        }
    },

【讨论】:

  • 欢迎来到 SO,如果没有解释,发布代码作为答案可能不是很有用。你能编辑你的答案来解释一下吗?您可能有兴趣阅读how to write a good answer 并参加tour
猜你喜欢
  • 1970-01-01
  • 2013-11-30
  • 2020-11-05
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
  • 2018-11-21
  • 2020-06-13
相关资源
最近更新 更多