2012-12-01 43 views
4

我有一個GridPanel和工具欄內有兩個按鈕「拒絕更改」和「保存更改」。下面的代碼顯示了每個按鈕的功能,到目前爲止按照預期工作。ExtJS:什麼是網格面板事件檢測網格數據更改

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); 
    } 

    ... 

}); 

如何啓用/禁用按鈕(或任何其它動作)只有在網格數據已經由用戶修改?即只有當網格行/域變髒時(反之亦然)?我的代碼應該聽哪個監聽器?

回答

4

如問題所示,插入到網格中的是CellEditing。通過監聽在網格中的數據發生更改時觸發的CellEditing Plugin的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)。 火災每當在商店的記錄在某種程度上已經改變 - 這可能包括添加或刪除記錄,或在現有記錄 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);

+0

感謝您的回覆;我試圖聽'datachanged'。但是當我改變網格中的數據,並且因此通過'set()',然後'commit()'手動改變商店的記錄(類型爲'Ext.data.Model')時,這個事件仍然沒有被觸發:/ –

+1

我改變了我的回答 –

+0

我沒有盲目地複製你的代碼示例,因爲上面提到的代碼結構是爲通信而簡化的。找到了另一個解在我吃完東西后會用答案更新這個問題;無論如何,謝謝+ 1ed :) –