ExtJS:检测网格数据更改的网格面板事件是啥

Posted

技术标签:

【中文标题】ExtJS:检测网格数据更改的网格面板事件是啥【英文标题】:ExtJS: What is the Grid Panel event to detect grid data changedExtJS:检测网格数据更改的网格面板事件是什么 【发布时间】:2012-12-01 17:13:10 【问题描述】:

我有一个 GridPanel,在工具栏中我有两个按钮“拒绝更改”和“保存更改”。下面的代码显示了每个按钮的作用,到目前为止一切都按预期工作。

Ext.define('APP.view.MyGrid' ,
    extend: 'Ext.grid.Panel',

    ...

    initComponent: function()     
        var me=this;
        me.store = myStore;         
        me.plugins = [
            Ext.create('Ext.grid.plugin.CellEditing', 
                clicksToEdit: 1, autoCancel: false
            ),
        ];          
        me.rejectBtn = 
            xtype:'button', id:'kbsGridCancelBtn', text:'Reject changes',
            handler: function()  me.store.rejectChanges(); 
        ,      
        me.saveBtn = 
            xtype:'button', id:'kbsGridSaveBtn', text:'Save changes',
            handler: function()  me.store.sync(); 
        ,      
        me.bbar = Ext.create('Ext.toolbar.Toolbar', 
            items : [ xtype: 'tbfill',me.rejectBtn,'-',me.saveBtn] 
        );

        me.callParent(arguments);
    

    ...

);

如何启用/禁用按钮(或任何其他操作)只有在用户修改了网格数据时? IE。仅当任何网格行/字段变脏时(反之亦然)?我的代码应该监听哪个监听器?

【问题讨论】:

【参考方案1】:

如问题所示,网格中有一个CellEditing 插件。通过侦听 CellEditing 插件的 validateedit 事件(当网格中的数据发生更改时会触发该事件),可以使用该事件的参数使用 Model 实例的 set 函数更新存储的行。当然,在完成所需的验证之后。代码根据getModifiedrecords 返回的内容决定是否启用/禁用按钮。

代码:

...

listeners: 
    'validateedit': function(cep, e, eOpts) 
        var me = this,            
            rowIdx = e.rowIdx, // row index
            fieldName = e.field,
            newVal = e.value,
            storeRow = this.store.getAt(rowIdx);

        // assuming valid input, proceed with the below    
        storeRow.set(fieldName, newVal);

        // if modified records > 0 then enable buttons
        var enableButtons = Boolean(me.store.getModifiedRecords().length);

        if (enableButtons) 
            /* enable buttons */
         else  /* disable buttons */         

    , scope: this


...

【讨论】:

【参考方案2】:

Ext.data.Store datachanged(this, eOpts)。 每当 Store 中的记录以某种方式发生更改时触发 - 这可能包括添加或删除记录,或更新现有记录中的数据 http://docs.sencha.com/ext-js/4-1/#!/api/Ext.data.Store-event-datachanged

function dataChangedFun(store)
    // code here


myStore.on("datachanged", dataChangedFun, this);

当您手动更改商店的记录时,请致电dataChangedFun(myStore);

【讨论】:

感谢您的回复;我试着听datachanged。但是当我更改网格中的数据,并因此通过set() 手动更改商店的记录(Ext.data.Model 类型),然后通过commit(),此事件仍未触发:/ 我没有盲目复制你的代码示例,因为我上面的代码结构是为了交流而简化的。找到另一个解决方案;吃完东西后会用答案更新这个问题;无论如何,谢谢,+1ed :)

以上是关于ExtJS:检测网格数据更改的网格面板事件是啥的主要内容,如果未能解决你的问题,请参考以下文章

Ext JS 网格面板事件

在树形面板中双击应该在网格面板中添加 Extjs

新添加的行不能拖放到 extjs 网格面板中

ExtJs 模态面板控制器看不到我的网格

在网格面板中动态更改 extjs 4 网格文本框背景颜色

ExtJS 4.1 如何更改网格面板标题高度