extjs vtype:使用同一行中的另一个值检查值

时间:2011-08-25 13:38:38

标签: javascript extjs extjs4

我有一个Ext.grid.Panel,我想验证用户输入:有一个名为delete的字段和一个名为string的字段。 delete的有效输入是一个数字,不能大于同一行中string字段的长度。我已经知道如何使用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值。

希望它很清楚。谢谢!

4 个答案:

答案 0 :(得分: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;
            }
        }
    }

答案 1 :(得分:0)

您应该处理validateedit( Ext.grid.plugin.Editing editor, Object e, Object eOpts ) event

第二个参数e包含对已编辑记录(e.record)的引用。您可以使用此记录来获取两个字段(stringdelete)并相应地执行验证。 将false分配给e.cancel将取消编辑。

答案 2 :(得分: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");
            }

答案 3 :(得分:0)

我通过以下方式访问了插件:

this.ownerCt.ownerCmp.plugins

这使您可以访问cellEditing插件,然后您可以执行以下操作:

var record = plugin.getActiveRecord();