2013-07-04 8 views
9

मेरी समझ से बैकबोन जेएस मॉडल का डिफ़ॉल्ट व्यवहार संग्रह के यूआरएल, को वापस करने के लिए मॉडल को urlRoot निर्दिष्ट किया गया है। मुझे काम करने का व्यवहार नहीं मिल रहा है।backboneJS model.url collection.url

प्रलेखन से:

model.url() ... प्रपत्र के URL उत्पन्न करता है: "[collection.url]/[id]" डिफ़ॉल्ट रूप से, लेकिन आप एक स्पष्ट निर्दिष्ट करके भी पार कर जाते urlRoot अगर मॉडल के संग्रह को ध्यान में नहीं रखा जाना चाहिए।

यहाँ मेरी संग्रह, और मॉडल क्रमशः है:

var MyCollection = Backbone.Collection.extend({ 
    model: Model, 
    initialize: function(options){ 
     this.options = options || {}; 
    }, 
    url: function(){ 
     return "/theurl/" + this.options.param; 
    } 
}); 
return MyCollection; 

...

var MyModel = Backbone.Model.extend({ 
    urlRoot: '/theurl', 
    initialize: function() { 
    } 
}); 
return MyModel; 

जब एक मॉडल एक संग्रह के बिना लोड किया जाता है, यह बहुत अच्छा काम करता है और /theurl को सबमिट करता है, लेकिन जब इसे संग्रह में लोड किया जाता है, तो सभी विधियां /theurl/param/ पर सबमिट होती हैं।

यदि मैं दस्तावेज़ को सही ढंग से समझ रहा हूं, तो मॉडल के urlRoot को इस व्यवहार को ओवरराइड करना चाहिए; और फिर भी मॉडल यूआरएल /theurl/param/{MODEL-ID} होना चाहिए।

मुझे क्या याद आ रही है/गलतफहमी पर कोई विचार?

...

पुनश्च: model: Model संग्रह से RequireJS

उत्तर

9

यह हमेशा संग्रह के यूआरएल का उपयोग करेगा, भले ही आप urlRoot निर्दिष्ट के माध्यम से में लाया जाता है।

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

तो तुम fetch या save मॉडल करना चाहते हैं और संग्रह आप एक विकल्प के रूप में स्पष्ट रूप इन तरीकों में urlRoot में उत्तीर्ण होना होगा द्वारा उत्पन्न यूआरएल को ओवरराइड करता है, तो। उदाहरण के लिए:

yourModel.save({ url: yourModel.urlRoot }); 

मैं सहमत हूं कि दस्तावेज भ्रमित है और यह मुझे हाल ही में भी पकड़ा गया है।

+0

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

+0

कुछ चीजें हैं। क्या आपने अभी क्लाइंट पर मॉडल बनाया है? यदि ऐसा है तो इसमें एक आईडी नहीं होगी क्योंकि इसे अभी तक सर्वर में सहेजा नहीं गया है। इस मामले में केवल एक सीआईडी ​​होगा। – dcarson

+2

मुझे लगता है कि इसके बजाय यह कहना चाहिए: 'yourModel.save ({}, {url: yourModel.urlRoot}); '। जिस तरह से यह लिखा गया है वह ऑब्जेक्ट पर 'url' प्रॉपर्टी' सेट करने जा रहा है क्योंकि 'सेव' के लिए पहला तर्क एक विशेषता हैश है। – flyingL123

1

UrlRoot एक फ़ंक्शन होना चाहिए और मॉडल को attributeId परिभाषित होना चाहिए। यदि आप अपने मॉडल को इस तरह परिभाषित करते हैं तो मॉडल ऑपरेशन में है या नहीं, तो सभी ऑपरेशन काम करेंगे।

urlRoot फ़ंक्शन द्वारा लौटाए गए यूआरएल के अंत में बैकबोन modelId जोड़ें।

var MyModel = Backbone.Model.extend({ 
    attributeId: 'myModelId' 
    urlRoot: function() { 
     return '/theurl'; 
    }, 
    initialize: function() { 
    } 
    defaults: { 
     myModelId: null 
    } 
}); 
+0

मैंने अभी एक स्ट्रिंग के बजाय 'urlRoot' को फ़ंक्शन के रूप में सेट करके इसका परीक्षण किया है और मॉडल के संग्रह में था जब मॉडल के' urlRoot' फ़ंक्शन का उपयोग नहीं किया गया था और मॉडल पर 'सेव' कहा जाता था। – dcarson

+0

यदि मॉडल संग्रह में है तो संग्रहण यूआरएल का उपयोग किया जाता है। urlRoot तभी होता है जब मॉडल संग्रह के बाहर होता है। – maketest

+0

बिल्कुल! वह व्यवहार वह था जो सवाल पूछने वाला व्यक्ति पूछताछ कर रहा था क्योंकि वह उसके लिए अप्रत्याशित था। दस्तावेज भ्रमित कर रहा है और यह सुझाव देता है कि 'urlRoot'' सेटिंग का मतलब मॉडल ** हमेशा ** urlRoot का उपयोग करता है, भले ही संग्रह में हो। जैसा कि मैंने अपने जवाब में कहा था और आपने अभी अपनी टिप्पणी में कहा है, यह वास्तव में मामला नहीं है। – dcarson

0

मॉडल में, का उपयोग करके देखें:

url: function() { 
    return 'your url goes here'; 
} 
संबंधित मुद्दे