2011-03-03 90 views
10

如何驗證依賴於另一個字段的一個字段?ExtJs從屬字段驗證

{ 
    xtype:   'textfield', 
    name:   'name2', 
    vtype:   'type',  // how to write the validation code for this if it 
           // depends on the value of another field? 
    allowBlank:  false 
} 

回答

25

通過添加您自己的自定義驗證程序並在其中執行驗證。

var field_one = new Ext.form.TextField({ 
    name: 'field_one', 
    fieldLabel: 'Field one' 
}); 

var field_two = new Ext.form.TextField({ 
    name: 'field_two', 
    fieldLabel: 'Field two', 
    validator: function(value){ 
     if(field_one.getValue() != value) { 
      return 'Error! Value not identical to field one'; 
     } else { 
      return true; 
     } 
    } 
}); 
+1

很好的答案,但是如何在另一個地方執行驗證,例如在另一個按鈕的動作偵聽器中執行驗證。 – fastcodejava 2011-03-04 02:58:15

+2

這也是可能的,但是如果你在按鈕處理程序中,你必須通過範圍或'Ext.getCmp()'來獲取對你的元素的引用。然後執行驗證並使用'field.markInvalid('...')手動將這些字段標記爲無效' – ChrisR 2011-03-09 07:16:49

+1

關於@ChrisR關於獲取引用的註釋。機會是你的領域是在同一個容器。所以你可以很容易地獲得驗證器函數內的其他字段的引用。函數內部的'this'是驗證器配置的文本字段。獲取對其他字段的引用:var otherField = this.up()。down('field [name = field_one]')'(ExtJS 4) – 2014-10-29 09:51:20

1

字段定義:

.... 
monitorValid:  true, 
.... 
}, { 
    xtype:   'textfield', 
    name:   'name1', 
    ref:   'name1', 

}, { 
    xtype:   'textfield', 
    name:   'name2', 
    ref:   'name2', 
    allowBlank:  false, 
.... 

下一個在initComponent(或監聽器,如果你preffer):

this.name2.on ('change', this._validate_name2, this); 

,並在FormPanel中定義的處理程序:

this._validate_name2: function () { 
    if (this.name1.getValue() == this.name2.getValue()) { 
     this.name2.markInvalid ('field does not match name1'); 
     this.name2.setValue (null); 
    } 
} 

「markInvalid ()方法不會導致如果該值通過了驗證,則該字段的驗證方法返回false。所以,簡單的標記字段爲無效不會阻止提交與Ext.form.Action.Submit.clientValidation選項組提交的表單。」

爲此組合allowBlank和setValue方法(空)將打破驗證

2

我嘲笑了我在Ext JS 5.1中如何使用組合框執行此操作的示例...它可以方便地移植到Ext 4代碼中,您只需使用initComponent而不是ViewController的init。以下代碼(和Fiddle ):

Ext.application({ 
    name: 'Fiddle', 

    launch: function() { 
    Ext.define('MyComboViewController', { 
     extend: 'Ext.app.ViewController', 
     alias: 'controller.mycombo', 
     init: function() { 
     this.getView().setStore(this.createStore()); 
     }, 
     createStore: function() { 
     var store = Ext.create('Ext.data.Store', { 
      fields: [ 
      {name: 'disp', type: 'string'}, 
      {name: 'val', type: 'int'} 
      ], 
      data: [ 
      {disp: 'One', val: 1}, 
      {disp: 'Two', val: 2}, 
      {disp: 'Three', val: 3}, 
      {disp: 'Four', val: 4}, 
      {disp: 'Five', val: 5} 
      ], 
      proxy: { 
      type: 'memory' 
      } 
     }); 
     return store; 
     } 
    }); 

    Ext.define('MyCombo', { 
     extend: 'Ext.form.field.ComboBox', 
     xtype: 'myCombo', 
     controller: 'mycombo', 
     displayField: 'disp', 
     valueField: 'val', 
     labelAlign: 'top', 
     validateOnChange: false, 
     typeAhead: true, 
     queryMode: 'local' 
    }); 

    Ext.define('MyCombosContainerViewController', { 
     extend: 'Ext.app.ViewController', 
     alias: 'controller.mycomboscontainer', 
     init: function() { 
     var startCombo = this.lookupReference('startCombo'); 
     var endCombo = this.lookupReference('endCombo'); 
     startCombo.validator = Ext.bind(this.comboValidator, this, [startCombo, endCombo]); 
     endCombo.validator = Ext.bind(this.comboValidator, this, [startCombo, endCombo]); 
     }, 
     comboValidator: function(startCombo, endCombo) { 
     return startCombo.getValue() < endCombo.getValue(); 
     }, 
     onSelectComboBox: function(combo) { 
     var startCombo = this.lookupReference('startCombo'); 
     var endCombo = this.lookupReference('endCombo'); 
     startCombo.validate(); 
     endCombo.validate(); 
     } 
    }); 

    Ext.define('MyCombosContainer', { 
     extend: 'Ext.form.FieldContainer', 
     controller: 'mycomboscontainer', 
     layout: { 
     type: 'hbox', 
     align: 'stretch' 
     }, 
     items: [{ 
     xtype: 'myCombo', 
     reference: 'startCombo', 
     fieldLabel: 'Start', 
     listeners: { 
      select: 'onSelectComboBox' 
     } 
     }, { 
     xtype: 'myCombo', 
     reference: 'endCombo', 
     fieldLabel: 'End', 
     listeners: { 
      select: 'onSelectComboBox' 
     } 
     }] 
    }); 

    Ext.create('MyCombosContainer', { 
     renderTo: Ext.getBody() 
    }); 
    } 
}); 
+0

小調:通常類定義在調用Ext外部.application' – 2015-11-10 14:54:11

0

驗證鏈接的字段I usua lly創建函數(我將它添加到我的Ext.lib.Validators類中,這樣我就可以在整個應用程序中調用它),它返回一個帶有預配置作用域和驗證邏輯的匿名函數(這樣我就可以在整個應用程序中多次使用它)。

下面是一個例子:

myValidator: function (firstFieldSelector, secondFieldSelector, thirdFieldSelector) { 
    return function() { 
     var firstField = Ext.ComponentQuery.query(firstFieldSelector)[0], 
      secondField= Ext.ComponentQuery.query(secondFieldSelector)[0], 
      thirdField= Ext.ComponentQuery.query(thirdFieldSelector)[0]; 

     if (firstField && secondField && thirdField) { 
      // Validation logic here... 
      if(true) { 
       return true; 
      } else { 
       return 'Error text here...'; 
      } 
     } else { 
      // Validator incorrectly configured, do not validate with it 
      return true; 
     } 
    } 
} 

這裏是一個example fiddle有時間跨度的選擇。