2012-04-18 13 views
27

में कोई मॉडल या संग्रह है या नहीं, जब आप रीढ़ की हड्डी सिंक ओवरराइड करते हैं, तो मॉडल/संग्रह .save()/fetch() दोनों एक ही रीढ़ की हड्डी सिंक विधि का उपयोग करते हैं, तो जांचने का सबसे अच्छा तरीका क्या है क्या Backbone.sync recieves एक मॉडल या मॉडल का संग्रह है?यह देखने के लिए जांचें कि बैकबोन जेएस

एक उदाहरण के रूप:

Backbone.sync = function(method, model, options){ 
    //Model here can be both a collection or a single model so 
if(model.isModel()) // there is no isModel or isCollection method 
} 

मुझे लगता है मैं एक "सुरक्षित" सबसे अच्छा अभ्यास रहा हूँ लगता है, मैं कर सकता कुछ विशेषताओं या तरीकों कि केवल एक मॉडल या एक संग्रह है के लिए पाठ्यक्रम की जांच की, लेकिन ऐसा लगता है हैकिश, एक बेहतर स्पष्ट तरीका नहीं होना चाहिए? और शायद वहाँ है कि मैं इसे नहीं मिला।

धन्यवाद!

उत्तर

56

तुम भी instanceof तो तरह की कोशिश कर सकते:

Backbone.sync = function(method, model, options) { 
    if (model instanceof Backbone.Model) { 
    ... 
    } else if (model instanceof Backbone.Collection) { 
    ... 
    } 
} 
2

यह समान रूप से हैकिश है, लेकिन बैकबोन संग्रह में एक मॉडल संपत्ति है, और एक मॉडल नहीं है - यह स्वयं ही एक मॉडल है।

शायद एक सुरक्षित तरीका model.toJSON() है और देखें कि परिणाम एक ऑब्जेक्ट या सरणी है या नहीं। आप शायद अपने कस्टम Backbone.sync में model.toJSON() पर जा रहे हैं, हालांकि यह बहुत कम्प्यूटेशनल रूप से महंगा है, वैसे भी ऐसा होगा।

+0

वोट दें क्योंकि मैं की जाँच कर रहा था 'लम्बाई' संपत्ति (केवल संग्रह ...?!?) कल कुछ त्वरित कोडिंग में! तुलना में 'मॉडल' पर जांच करना शानदार है। Haha। – eightyfive

+3

आपको लोगों को इस तरह की चीजों पर भरोसा नहीं करना चाहिए क्योंकि वे भविष्य में बदल सकते हैं और अपना कोड तोड़ सकते हैं। वर्णित उदाहरण के उदाहरण का प्रयोग करें :) –

0

आप ऐसा कुछ कर सकते हैं।

Backbone.Model.prototype.getType = function() { 
    return "Model"; 
} 

Backbone.Collection.prototype.getType = function() { 
    return "Collection"; 
} 

if(model.getType() == "Model") {} 
if(model.getType() == "Collection"){} 
+4

यह एक बहुत बुरा विचार है, जब एप्लिकेशन अधिक जटिल हो जाता है तो बनाए रखना लगभग असंभव है। और क्या होता है यदि किसी ऑब्जेक्ट को getType() विधि की आवश्यकता होती है जो एक प्रकार की कार के बारे में बात करती है, बजाय बैकबोन ऑब्जेक्ट का एक प्रकार? –

+0

@ निकोलसज़ोजोल असहमत। मैं नहीं देखता कि यह कैसे बनाए रखना मुश्किल है और दूसरा बिंदु बस अनुचित है। आप उपरोक्त विधियों को जो कुछ भी चाहते हैं उसे कॉल कर सकते हैं। उदाहरण के लिए 'getBackboneObjectType', जो निश्चित रूप से किसी भी नामकरण विवाद का कारण नहीं बनता है। –

+0

यह क्यों बुरा है, क्या इसे कार्यान्वयनकर्ता को किसी तृतीय पक्ष लाइब्रेरी में निहित ऑब्जेक्ट प्रकारों का ट्रैक रखने की आवश्यकता होती है, और बैकबोन के भविष्य के संस्करणों में हर बार एक नया प्रकार पेश होने पर एक नया गेट टाइप प्रोटोटाइप तैयार करता है। इसके अलावा, आप इसे पहचानने के लिए कोई वास्तविक आसान तरीका नहीं है (क्योंकि यह सब स्ट्रिंग तुलना के माध्यम से किया जा रहा है।) उदाहरण का उपयोग करते हुए किसी भी गलत वर्तनी का पता लगाने के लिए जावास्क्रिप्ट कंपाइलर्स (जैसे node.js) की अनुमति देता है, और संकलन विफल हो जाएगा बैकबोन के एक अद्यतन संस्करण में नाम बदलते हैं, जिससे पहचानने के लिए ब्रेकिंग परिवर्तन आसान हो जाता है। –

10

@ fiskers7 के जवाब गहरी विस्तार के साथ काम करता है:

 var Item = Backbone.Model.extend({ 
      className : 'Item', 
      size :10 
     }); 

     var VerySmallItem = Item.extend({ 
      size :0.1 
     }); 

     var item = new Item(); 
     var verySmall = new VerySmallItem(); 

     alert("item is Model ?" + (item instanceof Backbone.Model)); //true 
     alert("verySmall is Model ?" + (verySmall instanceof Backbone.Model)); //true 
0

मैं पूरी तरह यकीन है कि कैसे मैं इस बारे में क्या महसूस नहीं कर रहा हूँ, क्योंकि यह थोड़ा सा हैकिश लगता है, लेकिन मैं बिल्कुल नहीं सोच सकता कि इस समय यह बहुत बुरा क्यों होगा।

निश्चित रूप से सरल है, और अधिक तेजी से एक "instanceof" चेक (मैं यह सोचते कर रहा हूँ आप अपने वस्तुओं पर किसी अन्य कार्यों "isBBModel/संग्रह" का नाम नहीं होगा?)

Backbone.Model.prototype.isBBCollection = function() { return false; } 
Backbone.Model.prototype.isBBModel = function() { return true; } 
Backbone.Collection.prototype.isBBCollection = function() { return true; } 
Backbone.Collection.prototype.isBBModel = function() { return false; } 
संबंधित मुद्दे