2011-08-25 55 views
0

我有一個Ext.grid.Panel,我想驗證用戶輸入:有一個名爲delete的字段和一個名爲string的字段。 delete的有效輸入是一個數字,不能大於同一行中的string字段的長度。我已經知道如何使用vtype所以現在我有extjs vtype:使用同一行中的另一個值檢查值

delete : function(val, field){ 
      var expr = new RegExp("^[-]?[0-9]*[\.]?[0-9]*$"); 
      var num = expr.test(val); 
      if (!num) return false; //can't be not a number 
      else{ 
       //have no idea... 
      } 
     } 

我不知道如何爲同一行訪問string值。

希望它很清楚。謝謝!

回答

0

您應該處理validateedit(Ext.grid.plugin.Editing editor, Object e, Object eOpts)event

第二個參數e包含對編輯記錄的引用(e.record)。您可以使用此記錄來獲取這兩個字段(stringdelete)並相應地執行驗證。 指定falsee.cancel將取消編輯。

+0

謝謝。但我使用它有一個問題:我的'e.record.data [...]'存儲一箇舊的,未編輯的值。我如何訪問編輯的值? – k102

+0

所以,你是正確的,但在Ext中有一個錯誤:* EXTJSIV-2550 *,我不是唯一一個面對這個問題...... http://www.sencha.com/forum/showthread.php? 136911-validateedit事件此結果沒有回報的最新輸入的值 – k102

0

很好,有一個變通方法,但它的醜陋:

rowEditing.on({ 
    scope : this, 
    afteredit : function(roweditor, changes, record, rowIndex) { 
     var can_save = true; 
     var records = store.getRange(); 
     for(var i = 0; i < records.length; i++) { 
      if(records[i].data['delete'] >= records[i].data['string '].toString().length) { 
       Ext.MessageBox.alert('Input error', "blahblah"); 
      } 
1

如果你定義你的編輯器作爲一個變量,它實際上是更簡單和更清潔的,你可以參考它在田間驗證方法,並得到活動記錄,例如:

// create editor as a variable 
var cellEditing = Ext.create('Ext.grid.plugin.CellEditing', { 
    clicksToEdit: 1, 
    autoCancel: false 
}); 

// referring to the edited record in the validator function 
    { 
     xtype: 'datecolumn', 
     header: 'Comp Date', 
     dataIndex: 'comp_date', 
     width: 100, 
     format: 'j-M-Y', 
     editor: { 
      xtype: 'datefield', 
      format: 'j-M-Y', 
      validator: function(value) { 
       var record = cellEditing.getActiveRecord(); // get active record 
       if (Ext.Date.parse(value, 'j-M-Y') < record.get('start_date')) { 
        return 'Cannot complete before start date'; 
       } else return true; 
      } 
     } 
    } 
0

我訪問的插件方式如下:

this.ownerCt.ownerCmp.plugins 

這使您可以訪問cellEditing插件,從那裏你可以做一個:

var record = plugin.getActiveRecord(); 
相關問題