2011-09-14 19 views
10

में किसी मॉडल के लिए कस्टम सत्यापन नियम कैसे जोड़ें, सेन्चा द्वारा इस आलेख में अंतर्निहित सत्यापन नियमों (उपस्थिति, लंबाई, प्रारूप, समावेशन, बहिष्करण) का उपयोग करने का उल्लेख किया गया है और उल्लेख है कि कस्टम नियम जोड़ना आसान है, लेकिन यह कभी नहीं समझाता कि इसे कैसे करें। मैंने उच्च और निम्न गुगल किया है और सेन्चा दस्तावेज़ पढ़ा है, लेकिन मुझे यह कैसे करना है इस पर कुछ भी नहीं मिल रहा है। कोई विचार?सेन्चा टच

http://www.sencha.com/learn/using-validations-and-associations-in-sencha-touch

उत्तर

8

मुझे लगता है कि यह दस्तावेज में मामूली त्रुटियों में से एक है। मैं उन्हें, उदा कुछ कोड

if (Ext.data) { 
    Ext.data.validations.custom = function (config, value) { 
     if (config && Ext.isFunction(config.fn)) { 
      //this should be the model 
      if (config.self) { 
       return config.fn.call(config.self, value); 
      } else { 
       return config.fn(value); 
      } 
     } 
     else 
     { 
      return false; 
     } 
    }; 
    Ext.data.validations.customMessage = "Error"; 
} 

फिर जोड़कर काम करने के लिए, एक मॉडल के लिए एक सत्यापन जोड़ने प्रकार 'कस्टम' पर सेट के साथ मॉडल के सत्यापन सरणी के लिए एक वस्तु को जोड़ने के लिए मिला

{ 
    type: 'custom', field: 'SomeField', message: "Your field is bad", 
    fn: function (SomeFieldValueForThisInstance) { 
     //Add some validation code. The this pointer is set to the model object 
     //so you can call this.get("SomeOtherFieldToCheck") 
     //or any other instance method 

     //if the field is good 
     return true; 
     //else 
     return false; 
    } 
} 

अद्यतन: @salgiza सही था, वहाँ के लिए कुछ कदम मैं क्रम में उल्लेख करने के लिए 'इस' सही ढंग से सूचक स्थापित करने के लिए भूल गया है। आप Sencha स्पर्श कोड में देखें, तो आप Ext.data.Model के निर्माता के अंत में यह वहाँ एक init समारोह वस्तु पर परिभाषित है यह देखने के लिए जाँच करता है कि देखेंगे, और यदि हां, तो यह कहता है

 if (typeof this.init == 'function') { 
      this.init(); 

अपने मॉडल को परिभाषित करने के बाद आप प्रोटोटाइप में एक इनिट फ़ंक्शन जोड़ सकते हैं। फ़ंक्शन में, ऑब्जेक्ट के सत्यापन के लिए पुनरावृत्त करें और इसके लिए एक संदर्भ जोड़ें। किसी भी मॉडल के निर्माण से पहले यह कदम किया जाना चाहिए।

YourModel.prototype.init = function() { 
     var i, len; 
     if (this.validations) { 
      for (i = 0, len = this.validations.length; i < len; i++) { 
       this.validations[i].self = this; 
      } 
     } 
    }; 

फिर ऊपर कस्टम मान्यता समारोह में, बस अगर config एक आत्म सूचक है की जाँच करें और अगर यह होता है, स्वयं से कॉल करने की। मैंने उपरोक्त कोड को स्वयं का उपयोग करने के लिए संपादित किया है।

नोट: मैं मॉडल के init समारोह दस्तावेज नहीं दिख रहा है, इसलिए यदि Sencha यह से छुटकारा मिलता है, तो आप किसी अन्य तरह से मॉडल के सत्यापन के लिए इस सूचक को जोड़ने के लिए होगा।

क्षमा करें अगर इससे किसी के लिए भ्रम पैदा हुआ।

+0

मैं नहीं जानता, क्योंकि आप अपने उत्तर पोस्ट अगर यह बदल गया है, लेकिन Sencha में 1.1.1 सत्यापन गुंजाइश सत्यापन वस्तु है, इसलिए वहाँ किसी भी तरह से अन्य मूल्यों को प्राप्त करने के लिए प्रतीत नहीं होता मॉडल को सत्यापित करने के अलावा, यह कुछ भी नहीं करता है, क्योंकि यह "मॉडल" मॉडल नहीं है)। – salgiza

+0

1) आपके पास बहुत अधिक 'अन्य' शाखाएं हैं। 2) 'YourModel.prototype.init' कहां जाता है? इसका कोई अर्थ नहीं निकलता। –

+1

@ सराह वेसल 1. आप सही हैं। मैं दूसरे ब्लॉक के लिए एक} गायब था। उसके लिए माफ़ करना। 2. YourModel.prototype.init आपके मॉडल घोषित करने के बाद कहीं भी इसे निष्पादित कर सकता है।मैं अपनी निर्भरताओं को प्रबंधित करने के लिए RequJS का उपयोग करता हूं, इसलिए मैं मॉड्यूल को शामिल करता हूं जो मेरे मॉडल को शामिल करने के बाद प्रोटोटाइप में जोड़ता है। –

2

पर मैं थोड़ा Sencha स्पर्श 2 के लिए जेसन से कोड अनुकूल नहीं बनाया है सत्यापन के बाद पाया (अब मॉडल के config संपत्ति में है)। मैं एक बेस क्लास बनाने का सुझाव देता हूं जिसमें से आपके सभी अन्य मॉडल वर्गों का वारिस होगा। फिर, एक बार ऐसा करने के बाद, आप Ext.data.validations सिंगलटन में कस्टम सत्यापन जोड़ने के लिए जेसन के तकनीकी का उपयोग कर सकते हैं।

Ext.define('MyApp.model.CustomModelBase', { 
    extend: 'Ext.data.Model', 

    //adding an initializer to let custom validators access "self" 
    init : function() { 
     var i, len; 
     if (this.config.validations) { 
      for (i = 0, len = this.config.validations.length; i < len; i++) { 
       this.config.validations[i].self = this; 
      } 
     } 
    } 
}); 
2

मुझे लगता है कि सबसे आसान तरीका है अपने मॉडल में जटिल कस्टम सत्यापन जोड़ने के लिए सत्यापित करें विधि अधिलेखित करने के लिए है। अभिभावक कॉल के कारण, नीचे देखें, यह अंतर्निहित सत्यापन प्रकारों का समर्थन करता है।

validate: function() { 
    var me = this; 
    var errors = this.callParent(arguments); 

    /* custom complex validations here */ 
    if(true !== me.get('checkOne') && 
     true !== me.get('checkTwo') && 
     true !== me.get('checkThree')) { 
     errors.add(Ext.create('Ext.data.Error', { 
        field : 'checkOne', 
        message: 'Choose at least one check, e.g. checkOne' 
       })); 
    } 

    return errors; 
} 
संबंधित मुद्दे