2013-01-06 38 views
2

我要检查,如果一个文本框的内容数据库中已经存在,所以我定义了一个VTypes:为什么我定义的VType会被触发三次?

Ext.apply(Ext.form.field.VTypes,{ 
sampleSetExist: function(val, field) { 
    alert('triggered'); 
    var result; 
    Ext.Ajax.request({ 
     url: 'sampleSetExist.action', 
     params: { 
       name:val 
     }, 
     async:false, 
     success: function(response){ 
      var res = response.responseText; 
      var jsonObject = Ext.decode(res); 
      if(jsonObject.exist == true) 
       result = false; 
      else 
       result = true; 
     } 
     }); 
     return result; 
    } 
}); 

和文本框这样的:

{ 
    fieldLabel: 'Name', 
    itemId: 'sampleSetName', 
    name: 'ssi.name', 
    allowBlank: false, 
    validateOnBlur: true, 
    validateOnChange: false, 
    vtype: 'sampleSetExist', 
    vtypeText: 'The name has exist!' 
} 
…… 

当文本框模糊时,验证器函数sampleSetExist将被触发三次。为什么会发生这种情况?

+0

请在http://jsfiddle.net上创建示例 –

回答

1

你不应该担心它被调用三次。 VType不适用于需要询问服务器的事情。这种验证应在表单提交后执行。 VType假设返回true或false,并且仅用于字段或记录验证。

2

正如在另一个答案中提到的那样,vtype config(和validator函数)应该用于快速本地同步验证(例如确保日期范围结束在日期范围开始之后)。

做这种远程验证的一种更好的方法是使用change事件来完成这项工作。您可以将Ajax请求保存到该字段并使用它进行自己的验证。这应该完成你在客户端要做的事情,但请记住用户可以执行他们自己的表单提交。确保您在到达服务器时重新验证提交的值。

除了下面的代码,您可能需要在提交时进行额外验证,以确保用户在验证请求完成之前没有尝试提交表单。

注意:这可能不是最好的的方式,但它应该指向你在正确的方向。

// Field config 
{ 
    fieldLabel: "Name", 
    checkChangeBuffer: 500, // How long to wait after last change event 
    listeners: { 
     change: MyApp.onNameFieldChange 
    }, 
    // Rest of config here 
} 

// "MyApp" is whatever namespace you're using for this form 
MyApp.onNameFieldChange = function(field, newValue) { 
    var request = field.validationXhr; 

    // Cancel any existing requests 
    if (request) { 
     Ext.Ajax.abort(request); 
    } 

    // Send your params for validation 
    field.validationXhr = Ext.Ajax.request({ 
     url: "sampleSetExist.action", 
     /* params, timeout, etc. */ 

     success: function(response) { 
      var jsonResponse = Ext.decode(response.responseText); 
      if (jsonResponse.exist) { 
       // markInvalid only displays an error message. It doesn't actually 
       // set the field state to invalid. Extra logic may be needed. 
       field.markInvalid("The name " + newValue + " already exists!"); 
      } 
      else { 
       field.clearInvalid(); 
      } 
     } 
    }); 
} 
相关问题