extjs vtype: проверить значение, используя другое значение в той же строке - PullRequest
0 голосов
/ 25 августа 2011

У меня есть 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 ]

1 голос
/ 27 марта 2012

На самом деле гораздо проще и понятнее, если вы определяете свой редактор как переменную, вы можете просто обратиться к нему в методе проверки полей и получить активную запись, например:

// 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 голосов
/ 29 июня 2017

Я получил доступ к плагину следующим образом:

this.ownerCt.ownerCmp.plugins

Это дает вам доступ к плагину cellEditing, и оттуда вы можете сделать:

var record = plugin.getActiveRecord(); 
0 голосов
/ 26 августа 2011

хорошо, есть обходной путь, но он уродлив:

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");
            }
0 голосов
/ 25 августа 2011

Вы должны обработать validateedit( Ext.grid.plugin.Editing editor, Object e, Object eOpts ) событие .

Второй аргумент, e, содержит ссылку на редактируемую запись (e.record). Вы можете использовать эту запись, чтобы получить оба поля (string и delete) и соответственно выполнить проверку. Назначение false на e.cancel отменит редактирование.

...