2011-09-12 9 views
17

से एक भी रीढ़ मॉडल ला रहा है मैं एक मार्ग सेटअप कहते हैं: एक दोस्त के साथ www.mysite.com/photos/12345:सर्वर

'photos/:id' : 'showPhoto' 

और किसी यूआरएल साझा करता है।

जब उनके मित्र साझा लिंक पर क्लिक करते हैं, तो showPhoto को 12345 के साथ आईडी के रूप में पास किया जाता है। मैं नहीं कर सकते क्योंकि यह पता लगाने यहां तक ​​कि जब अपने आईडी संपत्ति की स्थापना और लाने (कह कर बुलाया), सर्वर से मॉडल लाने के लिए कैसे, रीढ़ की हड्डी का मानना ​​है कि मॉडल isNew और इतने ajax अनुरोध यूआरएल सिर्फ /photos बजाय /photos/12345 है:

showPhoto: (id) -> 
    photo = new models.Photo _id:id 
    photo.fetch #does a GET to /photos, I would have expected it to request /photos/12345 
    success:() -> 
     render photo view etc... 

Photo = Backbone.Model.extend 
    idAttribute: '_id' 
    urlRoot: '/photos' 

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

क्या तस्वीरों के पूरे संग्रह को लोड करने का समाधान है और फिर collection.getById(id) का उपयोग करें? जब मैं सिर्फ एक मॉडल के लिए गुण लोड करना चाहता हूं तो यह बहुत अक्षम है।

उत्तर

25

यदि आपके पास संग्रह के हिस्से के रूप में मॉडल नहीं है, तो आपको मॉडल को पूर्ण यूआरएल मैन्युअल रूप से बताना होगा। यह आपके द्वारा निर्दिष्ट urlRoot पर आईडी को स्वत: जोड़ नहीं देगा। इसलिए एक बार आपके द्वारा सेट किए, इस कोड को सही ढंग से काम करना चाहिए

Photo = Backbone.Model.extend({ 
    urlRoot: function(){ 
    if (this.isNew()){ 
     return "/photos"; 
    } else { 
     return "/photos/" + this.id; 
    } 
    } 
}); 

रीढ़ मॉडल की id का उपयोग करता है निर्धारित करने के लिए अगर यह नया है या नहीं,: आप ऐसा करने urlRoot के रूप में एक समारोह निर्दिष्ट कर सकते हैं। यदि ऐसा नहीं होता है, तो आप जांचने की बजाय if-statement में हमेशा एक आईडी की जांच कर सकते हैं।

+0

डेरिक, आप बैकबोन के बारे में इतना कुछ सीखने के लिए कैसे आए? मुझे कोई निश्चित गाइड नहीं मिला है। मैंने एडी ओस्मानी के मूलभूत सिद्धांतों और रीढ़ की हड्डी के साथ व्यंजनों को पढ़ा, साथ ही अनगिनत ब्लॉग भी शामिल हैं। आपको सबसे ज्यादा समझ में आता है। आपने इसे कहाँ चुना? – AndrewHenderson

+10

परीक्षण और त्रुटि, बैकबोन स्रोत कोड को पढ़ना, सब कुछ पढ़ना, मैं जावास्क्रिप्ट के बारे में जितना सीख सकता हूं ... लेकिन ज्यादातर अन्य लोगों को सिखाने की कोशिश कर रहा हूं। दूसरों को शिक्षण देना आपको गहरी खुदाई करने और वास्तव में समझने के लिए मजबूर करता है कि क्या हो रहा है। :) –

+1

यह एक दिनांकित उत्तर प्रतीत होता है क्योंकि बैकबोन के एपीआई में सुधार हुआ है। क्या हम इस प्रतिक्रिया पर सुधार कर सकते हैं? – sankargorthi

1

मैं संग्रह bootstrap हैं उस में सिर्फ एक मॉडल इस तरह के साथ (पेज के लिए निम्न प्रतिपादन द्वारा):

photos = new PhotoCollection(); 
photos.reset([ @Html.ToJson(Model) ]); 

ध्यान दें कि सर्वर साइड कोड है कि मैं का उपयोग ASP.Net MVC इसलिए का उपयोग करें आपके सर्वर साइड आर्किटेक्चर के लिए विशिष्ट कुछ। यह भी ध्यान रखें कि स्क्वायर ब्रैकेट महत्वपूर्ण हैं क्योंकि वे आपके एकवचन मॉडल को लेते हैं और इसे सरणी में लपेटते हैं।

आशा है कि यह सहायक है।

3

आप करते हैं यूआरएल आईडी को जोड़ना है या नहीं, रीढ़ की हड्डी बताने की जरूरत नहीं है। प्रलेखन के अनुसार: http://backbonejs.org/#Model-fetch, आप संग्रह में url के समतुल्य में urlRoot को बस सेट कर सकते हैं।

बैकबोन स्वचालित रूप से आप निम्न विधियों में से किसी एक का उपयोग प्रदान की है, यूआरएल के लिए वांछित आईडी जोड़ देंगे:

model.set("id", 5); //After initialized 
model = new Backbone.Model({id: 5}); //New model 

आप मैन्युअल रूप से मॉडल पर गुण हैश में आईडी सेट या सीधे हैं, रीढ़ की हड्डी जीता ' इसके बारे में पता नहीं है।

model.id = 5; //Don't do this! 
संबंधित मुद्दे