2011-10-20 13 views
14

तरहBackbone.js - कस्टम setters

window.model= Backbone.Model.extend({ 
    defaults:{ 
     name: "", 
     date: new Date().valueOf() 
    } 
}) 

मैं एक तरह से हमेशा मॉडल दुकान लोअर केस में नाम इनपुट पर ध्यान दिए बिना प्रदान की बनाने के लिए खोजने की कोशिश कर रहा हूँ एक सरल रीढ़ मॉडल की कल्पना करें। यानी,

model.set({name: "AbCd"}) 
model.get("name") // prints "AbCd" = current behavior 
model.get("name") // print "abcd" = required behavior 

ऐसा करने का सबसे अच्छा तरीका क्या है?

  1. अवहेलना "सेट" विधि
  2. उपयोग एक "SantizedModel" जो इस बेस मॉडल पर परिवर्तनों को सुनता और स्वच्छ आदानों संग्रहीत करता है: यहाँ सब मैं के बारे में सोच सकता है। इसके बाद सभी व्यू कोड को इस स्वच्छता मॉडल को पारित किया जाएगा।

विशिष्ट उदाहरण मैं तकनीकी रूप से बेहतर देखने के द्वारा नियंत्रित किया जा सकता है उल्लेख किया "लोअर केस करने के लिए", जबकि यह पुन: प्राप्त करने, लेकिन एक अलग मामले की कल्पना जहां, कहते हैं, उपयोगकर्ता पाउंड में मूल्यों में प्रवेश करती है और मैं केवल में मान संग्रहीत करना चाहते हैं मेरे डेटाबेस में $ s। एक ही मॉडल के लिए अलग-अलग विचार भी हो सकते हैं और मैं हर जगह इसका उपयोग करने के लिए "toLowerCase" नहीं करना चाहता हूं।

विचार?

उत्तर

5

यह एक हैक हो सकता है, क्योंकि यह है कि क्या नहीं इसके लिए बनाया गया था, लेकिन आप हमेशा इस बात के लिए एक सत्यापनकर्ता इस्तेमाल कर सकते हैं: के रूप में silent रूप में लंबे समय

window.model= Backbone.Model.extend({ 
    validate: function(attrs) { 
     if(attrs.name) { 
     attrs.name = attrs.name.toLowerCase() 
     } 

     return true; 
    } 
}) 

सत्यापित समारोह कहा जाता हो जाएगा (विकल्प सेट नहीं है) मॉडल में मान सेट होने से पहले, यह आपको वास्तव में सेट होने से पहले डेटा को म्यूटेट करने का मौका देता है।

+0

धन्यवाद। मैंने यह भी माना, लेकिन यह इसे पठनीय बनाने के मामले में पिछड़ा हुआ लग रहा था - सेट फ़ंक्शन को ओवरराइड करना या एक नया "सेटप्रोपर्टी" फ़ंक्शन जोड़ना जो इसे लोअरकेस में सेट करता है और फिर इसे रीढ़ की हड्डी में सेट करता है बेहतर हो सकता है। जब तक मैं कुछ याद नहीं कर रहा हूँ? – Naren

+0

निश्चित रूप से कुछ करने के लिए 'सेट' विधि को ओवरराइड करने में कुछ भी गलत नहीं है जो आपको करने की आवश्यकता है ... सेट से पहले कुछ प्री-प्रोसेसिंग? यदि आप मेल खाते हैं तो कुछ प्री-प्रोसेसर को कॉल करने के लिए आप 'Backbone.Model.prototype.set' को विस्तारित करने पर भी विचार कर सकते हैं ... इस तरह कुछ: https://gist.github.com/1310972 –

+0

मान्य केवल सहेजने के लिए कहा जाता है या अगर options.validate = सत्य सेट है। (चुप का उपयोग यहां नहीं किया जाता है, लेकिन जवाब काफी पुराना है) – webstrap

10

अद्यतन: आप प्लग-इन का उपयोग कर सकते हैं: https://github.com/berzniz/backbone.getters.setters


आप इस (यह अपने मॉडल के लिए जोड़) की तरह सेट विधि ओवरराइड कर सकते हैं:

set: function(key, value, options) { 
    // Normalize the key-value into an object 
    if (_.isObject(key) || key == null) { 
     attrs = key; 
     options = value; 
    } else { 
     attrs = {}; 
     attrs[key] = value; 
    } 

    // Go over all the set attributes and make your changes 
    for (attr in attrs) { 
     if (attr == 'name') { 
      attrs['name'] = attrs['name'].toLowerCase(); 
     } 
    } 

    return Backbone.Model.prototype.set.call(this, attrs, options); 
} 
+3

लूप के बजाय मैं अनुशंसा करता हूं कि अगर (attrs.name) attrs.name = attrs.name।toLowerCase(); – webstrap

+0

ध्यान दें कि यदि पहला पैरामीटर एक ऑब्जेक्ट है, तो गुणों की सेटिंग को पहले पैरामीटर के रूप में स्ट्रिंग के साथ 'set' पर निर्दिष्ट किया जाता है। तो सामान्य पैरामीटर केवल तभी जरूरी है जब पहला पैरामीटर स्ट्रिंग है। – Webthusiast

3

हार्न नहीं मेरा खुद का सींग, लेकिन I created a Backbone model "कंप्यूटेड" गुणों के साथ इस के आसपास पाने के लिए। दूसरे शब्दों में

var bm = Backbone.Model.extend({ 
    defaults: { 
    fullName: function(){return this.firstName + " " + this.lastName}, 
    lowerCaseName: function(){ 
     //Should probably belong in the view 
     return this.firstName.toLowerCase(); 

    } 
    } 
}) 

आप गणना की गई संपत्तियों पर भी बदलावों को सुनते हैं और काफी नियमित रूप से इसे नियमित रूप से मानते हैं।

The plugin Bereznitskey mentioned भी एक मान्य तरीका है।

+0

मैं अब यह कोशिश कर रहा हूं और यह मेरे वास्तविक कार्य को प्रतिबिंबित कर रहा है बल्कि वापसी मूल्य। 'डिफ़ॉल्ट: {दूरी: कार्य() {वापसी 10; } }, 'फिर 'console.log (this.model.get (' दूरी '));' ?? – trapper

+0

@ टैपर - क्या आप लिंक किए गए जिथब से "बेसकंप्यूटेड मॉडेल" से विस्तार कर रहे हैं? – Naren