2012-06-08 16 views
10

मुझे इसमें एक इनपुट के समूह के साथ एक फॉर्म को सत्यापित करने की आवश्यकता है। और, यदि कोई इनपुट अमान्य है, तो उस रूप में दृश्य रूप से इंगित करें कि एक विशेष विशेषता अमान्य है। इसके लिए मुझे प्रत्येक फॉर्म तत्व व्यक्तिगत रूप से मान्य करने की आवश्यकता है।बैकबोन: गुणों को मान्य करना एक

मेरे पास एक मॉडल & एक दृश्य है जो पूरे रूप का प्रतिनिधित्व करता है। अब जब मैं एक विशेषता अद्यतन करता हूं:

this.model.set('name', this.$name.val()) 

मॉडल पर मान्य विधि कहा जाएगा।

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

तो, मैं केवल एक विशेषता को कैसे सत्यापित करूं?

मुझे लगता है कि वैध() विधि के माध्यम से केवल एक विशेषता को मान्य करना संभव नहीं है। एक समाधान वैध विधि का उपयोग नहीं करना है, और इसके बजाय 'परिवर्तन' ईवेंट पर प्रत्येक विशेषता को मान्य करना है। लेकिन फिर यह बहुत सारे बदलाव हैंडलर बना देगा। क्या यह सही दृष्टिकोण है? मैं और क्या कर सकता हुँ?

जब भी आप model.set() का उपयोग मॉडल पर एक विशेषता सेट करने के लिए, आपके सत्यापन विधि चलाया जाता है और सभी गुण मान्य किए जाते हैं:

मैं भी है कि इस रीढ़ की हड्डी में एक बड़ा मुद्दा को इंगित करता है लगता है। यह counterintuitive लगता है क्योंकि आप बस उस एकल विशेषता को सत्यापित करना चाहते हैं।

+1

मैं मानता हूँ कि अगर इस डिजाइन के द्वारा होता है, यह वास्तव में एक समस्या है एक भी विशेषता पर मान्यता कह सकते हैं। यदि आप किसी फॉर्म के लिए मॉडल बना रहे हैं, तो कई फ़ील्ड रिक्त होंगे और इस प्रकार एक अमान्य स्थिति में होंगे। क्या फील्ड परिवर्तन केवल सहेजने से पहले मॉडल में संग्रहीत किया जाना चाहिए() कहा जाता है? वर्तमान में फील्ड परिवर्तनों के लिए ईवेंट प्रतिनिधि हैं। – SAGExSDX

उत्तर

9

Validate का उपयोग आपके मॉडल को वैध स्थिति में रखने के लिए किया जाता है, यह आपको silent:true विकल्प पास करने तक एक अमान्य मान सेट नहीं करने देगा।

आप या तो एक ही बार में अपने सभी गुण सेट कर सकते हैं:

var M=Backbone.Model.extend({ 
    defaults:{ 
     name:"", 
     count:0 
    }, 

    validate: function(attrs) { 
     var invalid=[]; 
     if (attrs.name==="") invalid.push("name"); 
     if (attrs.count===0) invalid.push("count"); 

     if (invalid.length>0) return invalid; 
    } 
}); 

var obj=new M(); 
obj.on("error",function(model,err) { 
    console.log(err); 
}); 
obj.set({ 
    name:"name", 
    count:1 
}); 

या उन्हें स्थापित करने

var M=Backbone.Model.extend({ 
    defaults:{ 
     name:"", 
     count:0 
    }, 

    validate: function(attrs) { 
     var invalid=[]; 
     if ((_.has(attrs,"name"))&&(attrs.name==="")) 
      invalid.push("name"); 
     if ((_.has(attrs,"count"))&&(attrs.count===0)) 
      invalid.push("count"); 

     if (invalid.length>0) return invalid; 
    } 
}); 

var obj=new M(); 
obj.on("error",function(model,err) { 
    console.log(err); 
}); 

if (!obj.validate({name:"name"})) 
    obj.set({name:"name"},{silent:true}); 
+1

किसी ऑब्जेक्ट मैपिंग विशेषताओं को उनकी समस्याओं पर लौटाना ('{उपयोगकर्ता नाम: ['बहुत लंबा', 'अमान्य वर्ण'], ...}') एक और विकल्प है। यह good_computer की समस्या के लिए एक बेहतर फिट हो सकता है। –

+0

@mu मैंने पठनीयता के लिए जितना संभव हो सके सत्यापन तर्क को रखने की कोशिश की, आपका वास्तव में एक बेहतर मैच हो सकता है। – nikoshr

+0

मैं आलोचना नहीं कर रहा हूं, बस एक संभावित संस्करण की पेशकश कर रहा हूं। यह किसी भी तरह का एक अच्छा जवाब है। –

1

यह बैकबोन का मुद्दा नहीं है, यह आपको किसी भी तरह से सत्यापन लिखने के लिए मजबूर नहीं करता है। मॉडल में बने सभी विशेषताओं के सत्यापन में कोई बिंदु नहीं है, आमतौर पर आपके मॉडल में अमान्य गुण नहीं होते हैं, क्योंकि set() वैधता विफल होने पर मॉडल को परिवर्तित नहीं करता है, जब तक कि आप चुप विकल्प पास न करें, लेकिन यह एक और कहानी है। हालांकि यदि आप इस तरह से चुनते हैं, तो सत्यापन ऊपर हमेशा बताए गए बिंदु के कारण गुणों को परिवर्तित नहीं करता है।

आप स्वतंत्र रूप से एक और तरीका चुन सकते हैं: केवल सेट किए गए गुणों को मान्य करें (validate() पर तर्क के रूप में पारित)।

+0

http://backbonejs.org/#Model-validate – Yaroslav

2

मैं हाल ही में एक छोटे से Backbone.js प्लगइन, Backbone.validateAll बनाया से पहले उन्हें एक एक करके मान्य, जो आपको केवल मान्य करने के लिए वर्तमान में सहेजे गए/सेट किए गए मॉडल विशेषताओं को सत्यापित करने की अनुमति देगा सभी विकल्प।मान्यता को ट्रिगर से बचने के लिए सच:

https://github.com/gfranko/Backbone.validateAll

0

तुम भी चुप पारित करने के लिए अपने स्वयं के कस्टम समारोह के साथ अपने मॉडल के सेट समारोह को ओवरलोड कर सकते हैं। विकल्प में: {सच चुप} और Backbone.Model {चुप: सच} के साथ समारोह की स्थापना की कॉल

set: function (key, value, options) { 
    options || (options = {}); 
    options = _.extend(options, { silent: true }); 
    return Backbone.Model.prototype.set.call(this, key, value, options); 
} 

यह मूलतः गुजरता है। इस तरह, आप पारित करने के लिए {चुप: सच} के लिए नहीं होगा विकल्प के रूप में हर जगह है, जहां आप this.model.set फोन ('प्रॉपर्टी', वैल, {चुप: सच})

सत्यापन के लिए आप बैकबोन का उपयोग भी कर सकते हैं। प्रमाणीकरण प्लगइन https://github.com/thedersen/backbone.validation

0

मुझे backbone.validation.js फ़ाइल में संशोधन करना पड़ा, लेकिन इसने मेरे लिए यह कार्य बहुत आसान बना दिया। मैंने नीचे दिए गए स्निपेट को वैध फ़ंक्शन में जोड़ा।

validate: function(attrs, setOptions){ 
      var model = this, 
       opt = _.extend({}, options, setOptions); 
      if(!attrs){ 
       return model.validate.call(model, _.extend(getValidatedAttrs(model), model.toJSON())); 
      } 

      ///////////BEGIN NEW CODE SNIPPET///////////// 
      if (typeof attrs === 'string') { 
       var attrHolder = attrs; 
       attrs = []; 
       attrs[attrHolder] = model.get(attrHolder); 
      } 
      ///////////END NEW CODE SNIPPET/////////////// 

      var result = validateObject(view, model, model.validation, attrs, opt); 
      model._isValid = result.isValid; 

      _.defer(function() { 
       model.trigger('validated', model._isValid, model, result.invalidAttrs); 
       model.trigger('validated:' + (model._isValid ? 'valid' : 'invalid'), model, result.invalidAttrs); 
      }); 

      if (!opt.forceUpdate && result.errorMessages.length > 0) { 
       return result.errorMessages; 
      } 
     } 

मैं तो इतना

this.model.set(attributeName, attributeValue, { silent: true }); 
this.model.validate(attributeName); 
संबंधित मुद्दे