2011-07-07 14 views
6

मेरे पास एक ऐसा फॉर्म है जहां उपयोगकर्ता किसी सूची में आइटम जोड़ना जारी रख सकता है। जब वे इस पृष्ठ को सबमिट करने के लिए जाते हैं, तो मैं यह सत्यापित करना चाहता हूं कि इस सूची में वास्तव में आइटम हैं (व्यक्तिगत आइटम नहीं जिन्हें वे पहले से ही मान्य कर चुके हैं)। प्रत्येक आइटम टी.आर. "कार्रवाई" की एक अतिरिक्त विशेषता होने के साथ एक तालिका में एक नई पंक्ति में जुड़ जाता है ... इसलिए ऐसा लगता है कि:jQuery वैलिडेटर - गैर-फॉर्म आइटम के विरुद्ध कैसे सत्यापित करें?

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

मुझे क्या करना प्रयास किया गया था कि कहा जाता है एक कस्टम addMethod जोड़ने है एक समारोह है जो एक विशेषता के रूप में कार्रवाई के साथ पंक्तियों की संख्या में गिना जाएगा:

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

और अगर है कि लंबाई 0 से अधिक है, यह सच है, अन्यथा, झूठी देता है।

यह वैधकर्ता कॉल के बाहर ठीक काम करता है लेकिन किसी कारण से यह पूरी तरह से इसे छोड़ देता है।

मैं वास्तव में एक उदाहरण या कुछ अंतर्दृष्टि का उपयोग कर सकता हूं कि इसे इस नियम को कैसे वैध बनाया जाए, भले ही यह विशेष रूप से एक फॉर्म तत्व न हो।

नीचे स्केल्ड कोड:

* ध्यान दें कि मैं पहले से ही संदेशों के लिए सेटअप चूक जा रहा है और नहीं क्या है।

$.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

कारण यह काम नहीं करता है, क्योंकि नियम पर आपत्ति की उम्मीद है अपने बच्चों प्रपत्र फ़ील्ड नाम होने के लिए (नाम इनकार नहीं)। ऐसा लगता है कि मान्य गैर-form तत्वों को मान्य करने में सक्षम नहीं है। हालांकि, वहाँ एक तरह से आप इस के आसपास पहुंच सकते हैं:

  1. अपने फ़ॉर्म के एक <input type='hidden' /> जोड़े कि आप सूची की स्थिति के आधार पर अद्यतन करें। दूसरे शब्दों में, हर बार जब आप कोई सूची आइटम जोड़ते या हटाते हैं, तो उस इनपुट का मान सेट करें। इसका एक स्पष्ट नुकसान है; आपका सत्यापन कोड अब दो कार्यों में फैला है (सूची आइटम जोड़ना और निकालना)। हालांकि, मुझे लगता है कि आपके पास पहले से कोड है जो जोड़ने/हटाने को संभालता है, आप एक सामान्य विधि जोड़ सकते हैं जो उपर्युक्त input की स्थिति का पुनर्मूल्यांकन करता है।

  2. उस input को सामान्य बनाएं और .validate() सामान्य रूप से उपयोग करें।

यहाँ एक वास्तव में किसी न किसी तरह से काम कर रहा उदाहरण है: http://jsfiddle.net/dT6Yd/

आप कर सकते हैं आइटम (1) थोड़ा आसान अगर आप knockoutjs की तरह एक रूपरेखा का उपयोग करें। आप उस ढांचे को अपनी सूची "निरीक्षण" करने के लिए बता सकते हैं और बिना ट्रैक किए अपने इनपुट को स्वचालित रूप से अपडेट कर सकते हैं।

समस्या को संभालने का सबसे साफ तरीका नहीं है, लेकिन मैंने इसे पहले इस तरह से देखा है और ऐसा लगता है कि यह काफी अच्छा काम करता है।

+0

ले श्वास। धन्यवाद! मुझे डर था कि ऐसा होने की आवश्यकता थी और मैं वास्तव में किसी अन्य को सत्यापित करने के लिए एक छिपे हुए फ़ील्ड को जोड़ना पसंद नहीं करता था। – Joshua

+0

छुपा फ़ील्ड चाल अब और काम नहीं करती है, यह नवीनतम संस्करण में अब छिपे हुए इनपुट को मान्य नहीं कर रही है। '