2011-07-07 5 views
6

私はユーザーがリストに項目を追加し続けることができるフォームを持っています。彼らがこのページを提出するとき、私はこのリストに実際に項目があることを検証したいと思います(すでに検証済みの項目ではありません)。jQuery Validator - 非フォーム項目の検証方法

<tr action="whatever">...</tr> 

は、私は何をしようとしていたことと呼ばれるカスタムaddMethodを追加している:それはのように見えるように、各項目は... TRは「アクション」の余分な属性を持つ表に新しい行に追加されますアクションとして行の数を属性として数える関数:

$("#tableID").find("tr[action]").length 

この長さが0より大きい場合はtrueを返し、そうでない場合はfalseを返します。

これはバリデータの呼び出しの外側で正常に動作しますが、何らかの理由で完全にスキップします。

実際にフォーム要素ではないにもかかわらず、この規則を検証する方法については、例やいくつかの洞察を実際に使用することができます。私はすでにデフォルトはメッセージやものではないためにセットアップされてい

* 注:

は、コードを縮小します。

$.validator.addMethod("validProductList", function (value, element) { 
     return this.optional(element) || validateProductList(); 
    }, "You have no products in your list"); 

$("#processForm").click(function() { 
     $("#pageForm").validate({ 
      submitHandler: function() { 
       $("#errors").hide(); 
       //processPage(); 
      }, 
      rules: { 
       //other rules, 
       validProductList: true 
      } 
     }); 
    }); 

function validateProductList() { 
    var isValid = false; 
    var useList = $("#tblAddedProducts").find("tr[action]").length; 
    if (useList > 0) { isValid = true; } 
    return isValid; 
} 

答えて

7

ルールオブジェクトがその子は、フォームフィールド名(名前を支配していない)ことを期待しているため、これが動作しない理由があります。 validateは非form要素を検証できないようです。しかし、あなたがこの問題を回避することができる方法があります:

  1. は、リストの状態に応じて更新フォームに<input type='hidden' />を追加します。つまり、リストアイテムを追加または削除するたびに、その入力値を設定します。これには明らかな欠点があります。あなたの検証コードは2つのアクション(リスト項目の追加と削除)に広がっています。しかし、あなたがすでに追加/削除を処理するコードを持っていると思いますが、前述のinputの状態を再評価する一般的なメソッドを追加することができます。

  2. inputが必要です。通常は.validate()を使用してください。あなたはknockoutjsのようなフレームワークを使用する場合は、アイテム(1)少し楽に行うことができますhttp://jsfiddle.net/dT6Yd/

ここで本当にラフな作業例です。その枠組みにあなたのリストを「観察」し、それを追跡することなく自動的に入力を更新することができます。

この問題を最もきれいに処理する方法ではありませんが、以前はこのようにしていましたが、十分に機能しているようです。

+0

ル・サウ。ありがとうございました!私はそれが起こる必要があったのではないかと心配していました。別のものを検証するためにただ1つの隠しフィールドを追加するのは本当に好きではありませんでした。 – Joshua

+0

隠しフィールドのトリックはもはや機能しません。最新のバージョンで隠れた入力を検証していません。 '