2012-11-26 16 views
5

बैकबोन प्रलेखन कहते हैं:समझौता रीढ़ मॉडल सेट, मान्य और बदल कॉलबैक

यदि सत्यापन विफल हो जाता Model.set असफल हो जायेगी - यह मान सेट नहीं होगा इसलिए यह किसी भी कॉलबैक ट्रिगर नहीं करेगा। हम Model.set पर {silent: true} पास कर सकते हैं - फिर यह मान सेट करेगा लेकिन न ही किसी भी कॉलबैक को ट्रिगर करेगा।

तो,

क्यों रीढ़ मॉडल मान्य स्थिति केवल एक विशेषता मान सेट करने के लिए आवश्यकता होती है? क्या होगा यदि हम यूआई के साथ इंटरैक्ट करते हैं तो गुणों को सेट करना चाहते हैं, लेकिन मॉडल अभी तक वैध नहीं है? इसका मतलब है कि परिवर्तन कॉलबैक अनुपलब्ध हैं जब तक कि हम {silent: true} पास नहीं करते हैं, फिर मैन्युअल रूप से परिवर्तन को ट्रिगर करते हैं ?!

कृपया आप जानते हैं कि इस से निपटने का एक बेहतर तरीका है :)

उत्तर

3

मैं क्यों सवालों के जवाब देने के लिए कैसे यकीन नहीं है, लेकिन आप कह सकते हैं वहाँ कारण है कि यह अच्छी बात है कि सेट के लिए तर्क हैं कि कहते हैं कि वैधता चलाता है। उदाहरण के लिए, यह वास्तविक समय में क्लाइंट साइड सत्यापन करने के लिए आसान बनाता है।

यदि आपकी समस्या को केवल उपयोगकर्ता द्वारा बदला जा रहा मान को सत्यापित करके हल किया जा सकता है, तो आप विधि के साथ अपने validate विधि को संयोजित करके ऐसा कर सकते हैं।

इस तरह उदाहरण कुछ के लिए:

Backbone.Model.extend({ 
    defaults : { name : "" }, 

    validate : function (attrs) { 
    var errors = {}; 
    if(this.hasChanged("name") && attr.name.length == 0) { 
     errors.name = "Need a name yo!"; 
    } 
    //... 

    if(_.keys(errors).length > 0) { 
     return errors; 
    } 
    } 
}) 
+0

धन्यवाद एंड्रयू लेकिन यह एक समस्या का समाधान करेगा और एक और बना देगा: अपरिवर्तित मूल्यों के लिए सत्यापन छोड़ना। – wcamarao

3

बैकबोन जब भी आप मॉडल पर सेट कॉल में, यह क्या मॉडल की विशेषताओं का ट्रैक रखता है बदल दिया गया है और क्या विशेषताओं नव added.Calling कर रहे हैं सत्यापित करें इसे और अधिक हो सकता है की अनुमति देता है इसे करने में कुशल। सेटिंग फ़ंक्शन में विकल्प के रूप में {चुप: सत्य} को वैध बनाना और निष्पादित करने के लिए परिवर्तित नहीं होता है, इसलिए यदि कोई परिवर्तन ईवेंट नहीं होता है।

If you want to set attributes as the user interacts with the UI, but the model is not valid yet

इस मामले आप सेट कर सकते हैं एक सादे वस्तु में परिवर्तन यकीन है कि वस्तु कुंजी बनाने में मॉडल की विशेषता के रूप में और फिर बस अपने मॉडल में सेट कुछ बिंदु पर sames हैं।

var uiChanges = {name:'x'}; //just fill it with your changes 
ur_model.set(uiModel); //then set it ,this way it fires change events only once 

अपने सादे वस्तु और मॉडल के बीच अंतर देखने के लिए कि ur_model.changedAttributes(uiChanges);

changedAttributes उपयोग कर सकते हैं - वापसी एक वस्तु सभी विशेषताओं कि बदल दिया है, या गलत अगर कोई बदली हुई गुण हैं युक्त।

आप इसे केवल उन सभी विशेषताओं को सहेजने के लिए उपयोग कर सकते हैं जो पूरे मॉडल को फिर से सहेजने के बजाय बदल गए हैं।

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