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

テキストフィールドがぼやけると、バリデータ関数 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 に答える