Extjs 4.1 - CellEditing 插件中的侦听第二次不起作用

Posted

技术标签:

【中文标题】Extjs 4.1 - CellEditing 插件中的侦听第二次不起作用【英文标题】:Extjs 4.1 - Listerning in CellEditing plugin not working at second time 【发布时间】:2013-07-24 06:38:32 【问题描述】:

我定义了一个 treeGrid 与插件 CellEditing 类似

Ext.define('MyExample', 
        extend: 'Ext.tree.Panel',   
        id: 'example',
        alias: 'example',
        ....
        plugins: [
            Ext.create('Ext.grid.plugin.CellEditing', 
                clicksToEdit: 1,
                listeners: 
                    beforeedit: function(plugin, edit)
                        alert('don't run second time');
                    
                
            )
        ],
        ...

我有一个按钮,当我点击这个按钮时会调用下面的窗口(这个窗口上面有treeGrid)

Ext.create('Ext.window.Window', 
title: 'Phân xử lý',
modal:true,
height: 500
width: 500
layout: 'border',
...
item[
 
  title: 'example',
  region: 'center',
  xtype: 'example', // that here
  layout: 'fit'
 
]

一切都在第一次工作,但是当我第一次关闭窗口并单击按钮再次调用窗口时,CellEditting 仍然工作但监听器不工作? 如何解决这个问题,谢谢

编辑 请在 http://jsfiddle.net/E6Uss/ 中查看我的示例代码 在我第一次单击按钮时。一切正常

但是当我关闭示例窗口并再次打开它时,我尝试再次单击以阻止单元格,我得到一个错误,例如

如何修复这个错误?谢谢

【问题讨论】:

在面板的initComponent 上创建插件 @MMT 我尝试 init initComponent: function () 但错误是 (TypeError: a is undefined ext-all.js line 21) ? @MMT 你能修复我的代码吗?我尝试添加 initComponent 但我认为 initComponent 不存在? 【参考方案1】:

这里的问题是您在树网格的插件数组中使用 Ext.create。这具有创建一次并将结果临时附加到您定义的类的效果。

如果关闭窗口,窗口内的所有资源都会被销毁。第二次实例化树面板时,插件不存在。看看这个小提琴:我明白你的问题是什么。看看http://jsfiddle.net/jdflores/E6Uss/1/

     
        ptype : 'cellediting',
        clicksToEdit: 1,
        listeners: 
            beforeedit: function(plugin, edit)
                console.log('EDITOR');
                if (edit.record.get('block')) 
                    alert('this cell have been blocked');
                    return false;
                
            
        
    

【讨论】:

赞成澄清我的答案。虽然我认为在实际意义上,我的回答可能是总体上最好的路线。 谢谢你的工作。我发现了一些问题,问题是单元格编辑和它们使用 initComponent 函数。我尝试创建 initComponent 函数但失败了。我认为 TreeGrid 没有 initComponent 功能?【参考方案2】:

每次单击按钮时,您都会重新创建窗口。这种重新创建可能会弄乱您的配置对象或破坏其中的关联或引用,或类似的东西。尝试通过将按钮代码替换为以下内容来每次重用窗口:

    Ext.create('Ext.Button', 
        text: 'Click me',
        visible: false,
        renderTo: Ext.getBody(),

        handler: function(button) 
            if(!button.myWindow)
            
                button.myWindow = Ext.create('Ext.window.Window', 
                   title: 'Example',
                   height     : 300,
                   width      : 500,
                   layout: 'border',
                   closeAction: 'hide',
                   items: [            
                            region: 'center',
                            floatable:false,
                            layout:'fit',
                            xtype: 'example',
                            margins:'1 1 1 1'
                        
                    ]
                 );
            
            button.myWindow.show();
        
    );

【讨论】:

【参考方案3】:

也许它需要完成编辑单元格,尝试完成它:

...
beforeedit: function(plugin, edit)
     alert('don't run second time');
     plugin.completeEdit();

煎茶:CompleteEdit

【讨论】:

我尝试在我的代码中:plugin.completeEdit(); if (edit.record.get('block'))return false;但不工作:(【参考方案4】:

我在这里整理了一个工作示例:http://jsfiddle.net/jdflores/6vJZf/1/

我认为您的专栏的问题在于它的 dataIndex 期望编辑器值是布尔类型(因为 'block' 被设置为 datIndex 而不是 'date')。我假设您使用“阻止”字段只是为了识别哪些被阻止进行编辑。我修改了这里提供的文件:http://jsfiddle.net/jdflores/6vJZf/1/

       
            text: 'Block Date',
            dataIndex: 'date',
            xtype: 'datecolumn',
            format: 'd/m/Y',
            editor: 
                xtype: 'datefield',
                allowBlank: true,
                format: 'd/m/Y'
             
        

【讨论】:

这不起作用:(。我希望我的日期单元格如果该单元格有block = true,则将被阻止,但在我的代码中,这只是第一次阻止? 我想你不明白我的问题。请看我的编辑。我只是解释我的问题 我认为你是对的。看看我下面的其他答案。

以上是关于Extjs 4.1 - CellEditing 插件中的侦听第二次不起作用的主要内容,如果未能解决你的问题,请参考以下文章

ExtJS 4.0中如何获取Ext.grid.plugin.CellEditing,表格单元中被修改的数据

在extjs经典网格中开始编辑单元格

ExtJs - 具有动态可关闭标签的文本字段

Extjs - 如何在Grid列中显示组合框

获取选定行的 ExtJS4 可编辑网格返回空

如何在 extjs 网格(单元格编辑)中将完整列显示为可编辑?