2012-03-09 6 views
5

क्या कोई नया मॉडल पहले बनाया गया है जब Backbone.js में मॉडल सत्यापन को दबाने का कोई तरीका है?बैकबोन.जेएस मॉडल को पहले संग्रहित करते समय सत्यापन करने से रोकें

मेरे ऐप में, मेरे पास एक मनमाना मॉडल के साथ एक संग्रह है, जिसे सूची आइटम के रूप में दर्शाया जाता है। उपयोगकर्ता प्रत्येक आइटम पर एक बटन क्लिक कर सकता है, जो वर्तमान आइटम के नीचे एक नई खाली वस्तु डालता है। खाली आइटम सत्यापन में असफल रहा है, जाहिर है, क्योंकि मैं नहीं चाहता कि एक खाली आइटम बाद में सहेजा जा रहा हो।

मुझे यह जानने का कोई तरीका नहीं है कि जब मैं नया आइटम बना रहा हूं तो समझदार डिफ़ॉल्ट क्या हो सकता है, इसलिए वैध डेटा के साथ नए मॉडल को पूर्ववत करना एक विकल्प जैसा प्रतीत नहीं होता है।

कोई सुझाव?

अद्यतन: एक स्पर्शिक रूप से संबंधित समस्या पर काम करते समय, मुझे एहसास हुआ कि मैं Backbone.js संस्करण 0.9.0 का उपयोग कर रहा था। जब यह संस्करण जारी किया गया था, तो अन्य लोगों के पास एक ही समस्या थी जो मैंने किया था, और उन्होंने गिटहब पर this issue में शिकायत की थी।

जेरेमी ने इसे ठीक करने के लिए 0.9.1 में सत्यापन को संशोधित किया। संग्रह में एक (अस्थायी रूप से) खाली मॉडल जोड़ना एक वैध असली दुनिया का उपयोग है। आप दृश्य में नए, खाली मॉडल को संभाल सकते हैं, लेकिन यदि आप मेरी तरह की वस्तुओं की एक सूची प्रबंधित कर रहे हैं, तो यह आपके संग्रह के संग्रह के अलावा आइटम दृश्यों (खाली एक सहित) का संग्रह करने के लिए मजबूर करता है। वैध मॉडल हो। यह एक अन्यथा सीधा परिदृश्य के लिए वास्तव में एक कट्टरपंथी कामकाज है। खुशी है कि यह तय हो गया।

उत्तर

3

आपने अवैध मॉडल :)

बैकबोन स्रोत कोड में थोड़ा खुदाई (0.9.1 कम से कम) से पता चला कि तंत्र अपने ऐड विधि करने के लिए विकल्पों को पारित करके धोखा दिया जा सकता जोड़ने के लिए नहीं करना पड़ेगा:

var Mod=Backbone.Model.extend({ 
    validate: function(attrs,opts) { 
     if (opts.init) return; 
     return "invalid"; 
    } 
}); 

var Col=Backbone.Collection.extend({ 
    model:Mod 
}); 

var c=new Col(); 
c.add({},{init:true}); 

console.log(c.length); 

एक फिडल: http://jsfiddle.net/jZeYB/

चेतावनी: यह लाइन नीचे चीजें टूट सकता है।

+0

अमान्य मॉडल जोड़ना सिद्धांत में समझ में नहीं आता है, लेकिन मैं उपयोगकर्ता को एक नई पंक्ति जोड़ने की अनुमति देने के लिए एक बेहतर तरीका नहीं सोच सकता। मुझे लगता है कि मैं इसे सभी दृश्य में संभाल सकता हूं, फिर आइटम को संग्रह में जोड़ते समय मान्य कर सकता हूं, लेकिन इससे इस ऐप के अन्य पहलुओं को बहुत जटिल बना दिया जाएगा। आपका उदाहरण बहुत अच्छा काम करता है, लेकिन जब मैं इसे अपने ऐप में आज़माता हूं तो 'विकल्प' पैरामीटर '{silent: true}' ऑब्जेक्ट के साथ अधिलेखित हो रहा है, जो Backbone.js स्वचालित रूप से shoehorn लगता है। मैं अभी बहुत परेशान हूँ। –

+0

आपको अमान्य मॉडल नहीं जोड़ना चाहिए - दृश्य को मॉडल पर सत्यापन द्वारा भेजे गए 'त्रुटि' संदेश को पकड़ना चाहिए और उपयोगकर्ता को अपना इनपुट ठीक करने या इसे रद्द करने देना चाहिए। जब मैं अपने सर्वर से सामान खींच रहा हूं तो मुझे अमान्य डेटा मिल जाता है, मैं इसे केवल मंजिल पर छोड़ देता हूं (और हमारे अजाक्स लॉगिंग सुविधा को एक संदेश भेजता हूं) क्योंकि संग्रह में अमान्य मॉडल एक 'बुरा विचार' – tkone

2

क्या आपको तुरंत संग्रह में मॉडल जोड़ने की आवश्यकता है? मुझे लगता है कि सत्यापन विफल रहता है क्योंकि आप इसे तुरंत संग्रह में जोड़ते हैं।

इसके बजाए, जब बटन दबाया जाता है तो आप केवल दृश्य और रिक्त मॉडल बना सकते हैं। जब मॉडल मान्य करता है तो आप इसे संग्रह में जोड़ते हैं। आपको संग्रह में जोड़ने के लिए नई पंक्ति पर सबमिट बटन/तंत्र की आवश्यकता होगी (जो स्वचालित रूप से सत्यापन को आमंत्रित करता है)।

+0

मैं जा रहा हूं इसे एक शॉट दें। मैं शायद मॉडल के 'चेंज' हैंडलर में आइटम जोड़ सकता हूं, जो सबमिट बटन की आवश्यकता को खत्म कर देगा। जब क्षेत्र फोकस खो देता है तो यह जोड़ा जाएगा। धन्यवाद! –

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