2011-08-12 11 views
8

चेतावनी: मैं बैकएंड के साथ काम कर रहा हूं कि मेरे पास पूर्ण नियंत्रण नहीं है, इसलिए मैं बैकबोन के भीतर कुछ विचारों के साथ कुश्ती कर रहा हूं कि शायद कहीं और बेहतर संबोधित किया जा सकता है ... दुर्भाग्यवश, मेरे पास उन्हें संभालने के अलावा कोई विकल्प नहीं है!बैकबोन.जेएस मॉडल सत्यापन केवल सेट-> सहेजें (fetch पर नहीं)

तो, मेरी समस्या यह है कि मैं वास्तव में एक फॉर्म से उपयोगकर्ता इनपुट को मान्य करना चाहता हूं (जब मैं बैकबोन मॉडल पर इसके साथ मूल्य निर्धारित करता हूं), लेकिन नए बनाए गए ऑब्जेक्ट्स पर एपीआई से प्राप्त मॉडल (पोस्ट के माध्यम से केवल एक नाम स्वीकार करें, और केवल एक नाम और ऑब्जेक्ट आईडी लौटाएं) मेरी सत्यापन जांच विफल हो जाएगी।

उदाहरण के तौर पर, जब डेटाबेस में एक नई वस्तु बनाई जाती है, तो दो प्रमुख फ़ील्ड खाली तारों के रूप में आबादी में आते हैं (और इसलिए जब बैकबोन एपीआई हिट करता है और मॉडलों को पॉप्युलेट करता है, तो यह उन तारों को खाली तारों से पॉप्युलेट करता है)। जब उपयोगकर्ता इन ऑब्जेक्ट को वापस सहेजता है, पोस्ट-एडिट, मैं उन्हें इन दो कुंजियों के मानों को दर्ज करने के लिए मजबूर करना चाहता हूं - जो बहुत आसान है, बैकबोन की सत्यापन विधि में निर्मित है।

समस्या यह है कि यह समस्या यह है कि प्रमाणीकरण दोनों fetch-> सेट (अवांछित व्यवहार) और सेट-> सहेजें (वांछित व्यवहार) पर गोलीबारी कर रहा है - और इसलिए नए बनाए गए मॉडल बिल्कुल लोड नहीं होंगे .. .बैकबोन उन्हें एकत्र करता है, सत्यापन विफल रहता है, और त्रुटियां आग लगती हैं।

तो, मेरा सवाल यह है: क्या "बैकबोन-वाई" तरीका केवल सेट-> सहेजें पर मॉडल को मान्य करने के लिए है, न कि fetch-> सेट पर? क्या मैं इस के आसपास काम करने के लिए एक विशिष्ट ट्रिगर का उपयोग कर सकता हूं?

किसी भी विचार की सराहना की जाएगी।

उत्तर

7

Backbone.Model.set मान्यता प्रदर्शन करेंगे नहीं यदि आप { silent: true } में गुजरती हैं, और fetch स्थापित करने के लिए के माध्यम से किसी भी विकल्प पारित करेंगे, तो आप या तो fetch ओवरराइड या अपने खुद के fetchSilent विधि से गुजरता है कि कि एक विकल्प वस्तु लिख सकते हैं।

हालांकि, आप Backbone.Collection.fetch के साथ थोड़ी सी गॉचा में भाग सकते हैं, क्योंकि जब यह सर्वर से विशेषताओं को प्राप्त करता है, तो यह set के साथ नए मॉडल नहीं बनाता है। इसके बजाए, यह model = new this.model(attrs, {collection: this}); के साथ एक नया मॉडल बनाता है और फिर ऑब्जेक्ट पर validate विधि होने पर सत्यापन करता है।

यह थोड़ा परेशान है। आप अपने संग्रह पर parse विधि को परिभाषित करके इसे प्राप्त कर सकते हैं (यदि आप एक का उपयोग कर रहे हैं) जो चुपचाप मॉडल बनाता है ({silent: true} का उपयोग करके), क्योंकि Backbone.Collection.add को पूरी तरह से गठित बैकबोन मॉडल प्राप्त होता है, तो यह सत्यापन नहीं चलाएगा। (में _add और _prepareModel विधियों को देखें)।

यह थोड़ा परेशान है कि संग्रह इस तरह से काम करता है, लेकिन (अब कम से कम) यह वही है।

+0

वास्तव में परेशान, लेकिन सुझावों के लिए धन्यवाद - बहुत सराहना की। – ltd

+0

जहां तक ​​मैं देख सकता हूं, नवीनतम स्रोत कोड रीढ़ की हड्डी में जब मौन पास हो जाता है तब भी सेटिंग मान्य होती है, जिससे इससे मदद नहीं मिलती –

4
अधिभावी के बजाय

लाने आप एक और बात कर सकते हैं: जब आप अपने मॉडल, model.silent के लिए जाँच करें और केवल मान्य है कि अगर मौजूद नहीं है मान्य

var test = new MyModel({ id: '123', silent: true }); 

// in your Model validate function 
validate: function(attrs) { 
    if (!attrs.silent) { 
    // validate logic here 
    } 
} 

तो फिर तुम मॉडल लाने कर सकते हैं: जब आप एक मॉडल लाने के लिए चाहते हैं

तो तुम निम्नलिखित है। भविष्य में सत्यापन के लिए, आप अपना मॉडल प्राप्त करने के बाद आप चुप को अनसेट कर सकते हैं।

संबंधित मुद्दे