web-dev-qa-db-ja.com

addClassRulesを使用してクラスにメッセージを追加する方法

jQuery Validate を使用して、データの行が多数繰り返されているページを検証しています。スペースが限られているため、各行には独自の検証サマリーがあります。

AddClassRulesを使用して検証ルールをページに適用しますが、デフォルトのエラーメッセージは要約では一般的すぎます(たとえば、「フィールドが必要です、フィールドが必要です」など)。

例:

jQuery.validator.addClassRules({
amount: {
    required: true,
    range: [0, 2000000]
},
comment: {
    maxlength: 51
},
owner: {
    notFirstOption: true
},
A: {
    required: function (element) {  
        return getParentElement($(element), "tr").find(".colB input.B").val().length > 0;
    },
    digits: true
}});

各検証クラスのルールにカスタムメッセージを適用できますか?理想的には、私は次のようなものを求めています。

jQuery.validator.addClassMessages({
    amount: {
        required: "Amount is required",
        range: "Amount must be between 0 and 2,000,000"
    },
    comment: {
        maxlength: "Comment may be a maximum of 51 characters"
    },
    owner: {
        notFirstOption: "Please select an owner"
    },
    A: {
        required: "A is required if B is entered",
        digits: "A must be numeric"
    }});

あなたが提供できるどんな助けにも前もって感謝します!

19
daddywoodland

ドキュメントでは、答えは、呼び出したいメソッドのエイリアスを作成し、カスタムメッセージを追加することです。

参照を確認してください 「リファクタリングルール」の見出しの下:

// alias required to cRequired with new message
$.validator.addMethod("cRequired", $.validator.methods.required,
"Customer name required");
// alias minlength, too
$.validator.addMethod("cMinlength", $.validator.methods.minlength, 
// leverage parameter replacement for minlength, {0} gets replaced with 2
$.format("Customer name must have at least {0} characters"));
// combine them both, including the parameter for minlength
$.validator.addClassRules("customer", { cRequired: true, cMinlength: 2 });
29
Mark Holtman

これは、以下のコードを使用して実行できます。

  $.validator.messages.accept = 'File must be JPG, GIF or PNG';

    $.validator.addClassRules("files", {            
      accept : "png|jpe?g|gif",  
      filesize : 2000000
    });
6
Gowri

私はかなり凶悪な解決策を思いついたが、もう少し時間があればもっときれいなものを望んでいる...

とにかく、jQueryメタデータを介してメッセージを割り当てることで、クラスごとにメッセージをカスタマイズできます。

class="amount {validate:
                {messages:
                  {required:'Amount is required',
                   range: 'Amount must be between 0 and 2,000,000',
                   digits: 'Amount must be numeric'}
                }
              }"

...グリッド行の各フィールドについても同様です。

'addClassRules'メソッドを拡張してmessagesパラメーターを受け入れることを検討しますが、今のところこれは機能するので機能します。

2
daddywoodland

誰もがこれに対する反応に明らかに興味を持っているので、これが私の答えを追求する次のステップです!

クラスメッセージの追加を可能にするメソッドをプラグインに追加し、デフォルトのメッセージハンドラーを修正してこれらを選択しました。

'customMetaMessage'の前に追加

customClassMessage: function (element, method) {
    //Get the elements class(es)
    var classes = $(element).attr("class").split(" ");

    //return any message associated with said class and method
    var m = $.validator.messages[classes[0]];

    return m && (m.constructor == String
        ? m
        : m[method]);
},

上記のメソッドへの呼び出しを含むように「defaultMessage」を修正しました

defaultMessage: function (element, method) {
                return this.findDefined(
                this.customMessage(element.name, method),
                this.customMetaMessage(element, method),
                this.customClassMessage(element, method),
                // title is never undefined, so handle empty string as undefined
                !this.settings.ignoreTitle && element.title || undefined,
                $.validator.messages[method],
                "<strong>Warning: No message defined for " + element.name + "</strong>"
            );
            },

'addClassMessages'メソッドを追加しました

        addClassMessages: function (className, messages) {
        if (className.constructor == String) {
            $.validator.messages[className] = messages != undefined ? messages : $.validator.messages[className];
        }
        else {
            $.extend(this.messages, className);
        }
    },

プラグインの外部でこれらの追加のメソッドをアタッチする方法をまだ理解できていません。少なくとも、「class」属性でエラーメッセージを宣言する必要はありません。

jQuery.validator.addClassMessages({
    amount: {
        required: "Amount is required",
        range: "Amount must be between 0 and 2,000,000",
        digits: "Amount must be numeric"
    }
});
2
daddywoodland

検証を実行する要素でdata-msg-required = "Error message here"を使用します

<select name="account1" data-msg-required="Please select an account">
<option value="">--Select Account--</option>
<optgroup label="100-Assets">
    <option value="1">A</option>
    <option value="2">B</option>
    <option value="3">C</option>
    <option value="4">D</option>
</optgroup>
1
Irfan Ashraf

これを試して:

jQuery.validator.addClassRules({
    amount: {
        required: true,
        range: [0, 2000000],
        messages: {required: "Required field!", range: "Invalid range!"}
    },
    comment: {
        maxlength: 51,
        messages: {maxlength: "Max 51 characters!"}
    }
})

それがあなたが探しているものだと思いますよね?

0
Martin Karlsson