2

我想检查数据库中是否存在文本字段的内容,所以我定义了一个 VTypes:

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!'
}
……

当textfield模糊时,验证器函数sampleSetExist会被触发3次。为什么会出现这种情况?

4

2 回答 2

2

正如另一个答案中提到的,vtype配置(以及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();
            }
        }
    });
}
于 2013-02-07T20:24:04.943 回答
1

您不必担心它会被调用 3 次。VType 不是为需要询问服务器的事情而设计的。这种验证应该在表单提交时执行。VType 假设返回 true 或 false,并且仅用于字段或记录验证。

于 2013-02-07T19:26:45.873 回答