2012-07-27 22 views
12

मैं निम्नलिखित मॉडल हैं:backbone.js एक मॉडल के url पैरामीटर बदल सकते हैं और लाने डेटा अपडेट नहीं करता दिलवाया

window.MyModel = Backbone.Model.extend({ 
    initialize: function(props){ 
      this.url = props.url; 
    } 

    parse: function(){ 

      // @override- parsing data fetched from URL 
    } 


}); 

// instantiate 
    var mod = new MyModel({url: 'some/url/here'}); 

मैं इस वैश्विक चर का उपयोग 'आधुनिक' बैकएंड से इस मॉडल में कुछ डेटा प्राप्त करने का।

// fetch 

mod.fetch({ 
     success: function(){ ...}, 
     error: ... 

}); 

उपरोक्त सभी अच्छी तरह से काम करता है .... मेरे मुद्दा: मैं यूआरएल को रीसेट बदलकर इस मॉडल का पुन: उपयोग और लाने कॉल करना चाहते हैं, लेकिन यह किसी भी तरह यूआरएल अपडेट नहीं होता। मैं कोशिश की है निम्नलिखित:

mod.fetch({ 
     data: {url:'/some/other/url'}, 
     postData: true, 
     success: function(){ //process data}, 
     error: ... 
    }); 


mod.set({url: '/some/other/url'}); 
// called fetch() without data: and postData: attributes as mentioned in previous 

मैं अपने मॉडल के लिए url सेट करना इतना है कि मैं फोन लाने सकता है() और इसे अद्यतन यूआरएल से डेटा को हासिल करेगा? क्या मैं कुछ भूल रहा हूँ। किसी भी संकेत दिए गए के लिए धन्यवाद ..

UPDATE 1: असल में, मैं असमर्थ हूँ अद्यतन मूल्यों पाने के लिए अगर मैं

model.set({url: 'new value'}); 

model.fetch(); 

'मॉडल' के बाद किया था एक वैश्विक चर रहा है । 'मॉडल' के एक ताजा उदाहरण बनाकर काम करता है:

model = new Model({url:'/some/other/url'}); 
    model.fetch(); 

हालांकि, के रूप में आवश्यक काम करता है। क्या इसका मतलब यह है कि एक मॉडल उदाहरण स्थायी रूप से यूआरएल से जुड़ा हुआ है और इसे रीसेट नहीं किया जा सकता है?

अद्यतन में मेरे प्रश्न के उत्तर 1 मॉडल उदाहरण स्थायी रूप से यूआरएल से जुड़ा नहीं है। इसे गतिशील रूप से रीसेट किया जा सकता है। बेहतर समझ के लिए कृपया @ tkone की पूरी व्याख्या और फिर @fguillens 'समाधान के माध्यम से पढ़ें।

mod.url = '/some/other/url' 

यूआरएल है मॉडल के ही उदाहरण का हिस्सा नहीं है, बल्कि MyModel वस्तु की एक विशेषता है कि आप अपने बना रहे हैं:

+0

कारण है कि आप यूआरएल बदल रहे हैं? एक विश्वसनीय webservice के पीछे विचार यह है कि आपकी ऑब्जेक्ट हमेशा एक ही यूआरएल (एक विशिष्ट वस्तु के लिए आवश्यक आईडी के साथ) पर उपलब्ध होती है – tkone

उत्तर

24

के बाद समझ लिया है @tkone की व्याख्या ...

आप अभी भी एक गतिशील Model.url आप हमेशा रन टाइम को इसके निर्माण में देरी कर सकते करना चाहते हैं, इस प्रयास करें:

window.MyModel = Backbone.Model.extend({ 
    url: function(){ 
    return this.instanceUrl; 
    }, 
    initialize: function(props){ 
    this.instanceUrl = props.url; 
    } 
} 
+4

आप कर सकते हैं: 'mm = new MyModel; mm.url = '/ mynewurl /'; 'साथ ही साथ। बैकबोन इस सामान के साथ सुपर लचीला है। – tkone

+0

@fguillen - धन्यवाद !! निर्माण के समय में निर्माण में देरी हुई चाल चल रही थी !! – Vikram

+0

@tkone - धन्यवाद फिर से! आपके सभी सहायक पॉइंटर्स के लिए – Vikram

11

खैर जवाब यहाँ है कि आप क्या करना चाहते है मॉडल उदाहरण से। इसलिए, आप इसे बस सेट करेंगे जैसे कि यह एक सामान्य जावास्क्रिप्ट ऑब्जेक्ट प्रॉपर्टी थी। set केवल तभी उपयोग किया जाता है जब आप जिस डेटा को सेट कर रहे हैं (या get के साथ मिलकर) वास्तव में उस डेटा का एक विशेषता है जिसे आप सर्वर से भेजना/प्राप्त करना चाहते हैं।

लेकिन यूआरएल क्यों बदल रहे हैं सवाल यह है कि हमें पूछना चाहिए। बैकबोन के मॉडल/संग्रह प्रणाली के पीछे विचार यह है कि आप एक आरईएसटी एंडपॉइंट से बात करते हैं और प्रत्येक मॉडल के पास एक अंतिम अंतराल होता है।

आप एक ब्लॉग मिल गया है की तरह और कहा कि ब्लॉग एक "प्रवेश" वस्तु, जिस पर उपलब्ध है:

/rest/entry/ 

और तुम प्रवेश के लिए एक रीढ़ मॉडल मिल गया है:

Entry = Backbone.Model.extend({urlBase: '/rest/entry'}); 

अब जब आप save या fetch बैकबोन जानता है कि यह कैसे काम करता है।

आप एक नया मॉडल बना रहे हैं तो जैसे: बैकबोन

e = new Entry(); 
e.set({title: "my blog rulez", body: "this is the best blog evar!!!!1!!"}); 
e.save(); 

यह तो होगा शरीर के साथ /rest/entry एक HTTP पोस्ट अनुरोध करते हैं:

{ 
    "title": "my blog rulez", 
    "body": "this is the best blog evar!!!!1!!" 
} 

(जब आप अपने mod.set({url: '/some/other/url'}); करना आप वास्तव में url नामक फ़ील्ड जोड़ रहे हैं, इसलिए सर्वर उस JSON पोस्ट बॉडी के हिस्से के रूप में "url": "/some/other/url" भेज देगा:

{ 
    "title": "my blog rulez", 
    "body": "this is the best blog evar!!!!1!!", 
    "url": "/some/other/url" 
} 

सर्वर उसके बाद ही कहते हैं, की तरह के साथ, एक ही मॉडल के साथ पर HTTP 200 (या 201) प्रतिक्रिया के साथ जवाब होता है, और आईडी संलग्न:

{ 
    "id": 1, 
    "title": "my blog rulez", 
    "body": "this is the best blog evar!!!!1!!" 
} 

और है कि आप क्या चाहते हैं नहीं है के लिए, सही?)

अब आपको यह मॉडल मिला है और इसे एक आईडी मिली है। इसका मतलब यह है कि अगर आप इसे बदल:

e.set('title', 'my blog is actually just ok'); 
e.save() 

बैकबोन अब सर्वर पर संसाधन अद्यतन करने के लिए /rest/entry/1 पर एक HTTP PUT अनुरोध बनाता है।

सर्वर देखता है कि आप /rest/entry/ एंडपॉइंट पर आईडी 1 के बारे में बात कर रहे हैं, इसलिए मौजूदा रिकॉर्ड को अपडेट करना और (HTTP 200 वापस भेजना) जानता है।

टी एल; डॉ

URL बदल मत करो, रीढ़ होगा। डेटा के एक नए टुकड़े के लिए एक नया मॉडल बनाओ।

+0

आपके स्पष्टीकरण के लिए धन्यवाद! मेरे पास एक मॉडल और यूआरएल परम assoc है। जब मैं इस मॉडल को प्रारंभ करता हूं तो मैं एक यूआरएल मान पास करता हूं और कॉल लाने() को कॉल करता हूं। अब मैं इस 'यूआरएल' मान को बदलना चाहता हूं क्योंकि इस मॉडल में प्राप्त डेटा में अभी भी समान पैरा होंगे: उदाहरण के लिए url1:/top; यूआरएल 2:/टॉप/फिल्टर 1; url3:/top/filter2 मुझे यकीन नहीं है कि यह अच्छा अभ्यास है, लेकिन सभी 3 यूआरएल बैकएंड से उसी डेटा को वापस कर देंगे, सिवाय इसके कि निर्दिष्ट के रूप में फ़िल्टरिंग होगी। मुझे क्लिक किए गए 'टैब' के आधार पर यूआरएल के बीच स्विच करने की आवश्यकता है। जैसा कि आपने उल्लेख किया है, मेरे पास कई मॉडल हो सकते हैं लेकिन मैं सोच रहा था कि क्या मैं पुन: उपयोग कर सकता हूं। – Vikram

+0

मुझे बताएं कि आप क्या सोचते हैं – Vikram

+0

@ विक्रम ताकि आप अपने फ़िल्टर पैरामीटर द्वारा फ़िल्टर किए गए डेटा के सीमित सेट को वापस प्राप्त करने का प्रयास कर रहे हों? मैं डेटा के प्रत्येक सेट के लिए एक नया संग्रह बनाने और संग्रह की 'url' विशेषता को बदलने की सलाह दूंगा। तो आपके पास 'filter1' नामक एक संग्रह होगा, जिसका URL विशेषता '/ top/filter1' पर सेट की गई है, और बहुत आगे। – tkone

3
model.urlRoot = "/your/url" 

या

model.urlRoot = function(){ return "/your/url"; } 

या

model.url = "/your/url" 

या

model.url = function(){ return "/your/url"; } 

डिफ़ॉल्ट 'url' एक Backbone.Model वस्तु की संपत्ति के रूप में नीचे है। बैकबोन.जेएस डॉक्टर कहते हैं:

सर्वर पर मॉडल के प्रतिनिधित्व के लिए डिफ़ॉल्ट यूआरएल - यदि आप बैकबोन के आरामपूर्ण तरीकों का उपयोग कर रहे हैं, तो अंतराल को बदलने के लिए इसे ओवरराइड करें।

url: function() { 
    var base = getValue(this, 'urlRoot') || getValue(this.collection, 'url') || urlError(); 
    if (this.isNew()) return base; 
    return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + encodeURIComponent(this.id); 
}, 

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

+0

उत्तर देने के लिए अपना समय लेने के लिए धन्यवाद! मैं अपने आवेदन को उत्पन्न करने वाले यूआरएल के आधार पर गतिशील रूप से मॉडल में यूआरएल स्विच करने का एक तरीका देख रहा था। मैंने जो जवाब दिया वह मेरे लिए बहुत अच्छा काम करता है। – Vikram

0

आप लाने समारोह में विकल्प के रूप में यूआरएल सेट कर सकते हैं, इस तरह:

var mod = new MyModel(); 
mod.fetch({ 
    url: '/some/other/url', 
    data: {} 
}); 
संबंधित मुद्दे