मैं बैकबोन में एकल मॉडल कैसे लाऊं?


93

मेरे पास Clockबैकबोन में एक मॉडल है:

var Clock = Backbone.Model.extend({});

मैं उस का एक उदाहरण प्राप्त करने की कोशिश कर रहा हूं जिसमें नवीनतम जानकारी है /clocks/123। कुछ चीजें जो मैंने कोशिश की हैं:

एक "वर्ग" - विधि

Clock.fetch(123)
// TypeError: Object function (){ ... } has no method 'fetch'

एक उदाहरण बनाना और फिर उस fetchपर कॉल करना:

c = new Clock({id: 123})
c.fetch()
// Error: A 'url' property or function must be specified

संग्रह

मैंने एक AllClocksसंग्रह संसाधन बनाने की कोशिश की (भले ही पृष्ठ पर इस तरह की चीज़ के लिए मेरा कोई उपयोग नहीं है):

var AllClocks = Backbone.Collection.extend({
  model: Clock,
  url: '/clocks/'
});
var allClocks = new AllClocks();
allClocks.fetch(123);
// returns everything from /clocks/

मुझे केवल एक एपीआई-समर्थित घड़ी कैसे मिलेगी ?


IMHO यह संग्रह का है। संग्रह # fetchOne (आईडी, कॉलबैक) जैसा कुछ।
जूलियन मैकर

जवाबों:


26

आपका दूसरा तरीका वह तरीका है जो मैंने इस्तेमाल किया है। अपने घड़ी मॉडल में निम्न जोड़ने का प्रयास करें:

url : function() {
  var base = 'clocks';
  if (this.isNew()) return base;
  return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + this.id;
},

यह दृष्टिकोण मानता है कि आपने अपने URL में hashbang के साथ नियंत्रकों को लागू किया है जैसे कि, http://www.mydomain.com/#clocks/123 , लेकिन यह तब भी काम करना चाहिए जब तक आपने अभी तक नहीं किया है।


3
बैकबोन मॉडल डॉक्यूमेंटेशन documentcloud.github.com/backbone/#Model-url
makevoid

@makevoid मैं आपके द्वारा किए गए काम को कॉफी स्क्रिप्ट या दस्तावेज़ में दिए गए उदाहरण से नहीं बना सकता है, एंड्रयू उदाहरण काम करता है, क्या आप प्रदान कर सकते हैं और foo.url () के साथ उदाहरण दे सकते हैं, यह हमेशा मुझे बताता है कि कोई फ़ंक्शन url नहीं है।
रॉबर्टो अलर्कन

@makevoid ऐसा लगता है कि जिस पद्धति का आप केवल काम कर रहे हैं यदि मॉडल एक संग्रह में बनाया गया है। संग्रह को नोटिस करें [collection.url]/[id]
स्टीवन देवीज्वर

@makevoid क्या आप एक कामकाजी लिंक प्रदान कर सकते हैं? दुर्भाग्य से, यह एक अब के लिए टूट गया है
एलेक्सनकोलावे94

यहां काम करने की कड़ी है (उन्होंने डॉक्टर को स्थानांतरित कर दिया! वाह, 5 साल बीत गए, geez): backbonejs.org/#Model-url - @StevenDevijver सही है
makevoid

137

मॉडल में urlRoot निर्दिष्ट करने का प्रयास करें :

डॉक्स से:

var Book = Backbone.Model.extend({urlRoot : '/books'});
var solaris = new Book({id: "1083-lem-solaris"});
solaris.fetch();

2
यह अच्छा है, लेकिन कभी-कभी आप मॉडल को पुनः स्थापित नहीं करना चाहते हैं। यदि आप एक ही मॉडल के खिलाफ एक विशिष्ट आइटम लाना चाहते हैं, तो आप एक मूक सेट कर सकते हैं currentBook.set('id', 13423, {silent:true}):। यह भी काम करता है, लेकिन मुझे यकीन नहीं है कि क्यों:currentBook.id = 13423
सिम्पलजी

1
@SimplGy जो काम करता है क्योंकि model.idअनिवार्य रूप से पर्यायवाची है model.attributes.id। यदि आप कॉल करते हैं model.set('id'), तो बैकबोन model.idआपके द्वारा निर्दिष्ट किए गए सभी को सेट करता है। और model.idमॉडल-विशिष्ट URL बनाते समय इसका उपयोग किया जाता है।
लैम्बर्ट

26

मैं व्यक्तिगत रूप से मॉडल # यूआरएल विधि प्रलेखन के बाद सिफारिश करता हूं

model = new Model(id: 1)
view = new View(model: model) 
collection = new Collection([model])
model.fetch()

अपने संग्रह में संग्रह url जोड़ना याद रखें:

url: "/models"

और अपने दृश्य के आरंभिक कार्य में करें:

this.model.bind("change", this.render)

इस तरह से इस url का उपयोग करते हुए बैकबोन एक ajax अनुरोध करेगा:

"/models/1"

आपके मॉडल को अपडेट किया जाएगा और संग्रह # url या मॉडल # urlRoot को संशोधित किए बिना, दृश्य प्रदान किया जाएगा

नोट: क्षमा करें, यह उदाहरण कॉफी स्क्रिप्ट में सामने आया था, लेकिन आप इसे आसानी से js में जोड़ सकते हैं


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

यह ठीक लग रहा है, लेकिन संग्रह लाइन उन मामलों में अजीब लगती है जब हमें वास्तव में संग्रह की आवश्यकता नहीं होती है।
डिंगल

मुझे यह काम करने के लिए नहीं मिला: this.model.get ('फ़ील्ड')। ऐसा लगता है कि मॉडल को उप ऑब्जेक्ट बनाया गया है
मुहामिन

1
this.model.bind ("परिवर्तन", this.render, यह) मेरे लिए अच्छी तरह से काम किया
dmi3y

1
@UlysseBN हाँ (वर्ष 2011) था, आप वर बयान में जोड़ सकते हैं, {}अंदर ()से पारित कर दिया वस्तुओं और वैकल्पिक के लिए की ;लाइनों के अंत विज्ञापन
makevoid

12
var Person = Backbone.Model.extend({urlRoot : '/person/details'});
var myName = new Person({id: "12345"});
myName.fetch();

परिणामस्वरूप आप पर एक अजाक्स अनुरोध करते हैं

URL http://[domainName]/person/details/id 

और आपके पास JSON प्रतिक्रिया वापस आ गई है।

Enjoiiii !!!


2
यह @ हर्नान के रूप में एक ही समाधान है
ब्रेंडेन

0

... और ऐसा करें यदि आप मॉडल urlRoot पर ट्रेलिंग स्लैश नहीं चाहते हैं:

    url : function() {                        
        return this.urlRoot + this.id;
    },

0

आपको संभवतः एक संग्रह के ऑब्जेक्ट को एक्सेस करना चाहिए और इसे हर समय संग्रह में रखना चाहिए। यह इस तरह से करना चाहिये:

var AllClocks = Backbone.Collection.extend({
  model: Clock,
  url: '/clocks/'
});

var allClocks = new AllClocks();
my_clock = allClocks.add({id: 123});
my_clock.fetch()

2
तुम नहीं जानते कि हो सकता है कि उसे एक घड़ी की आवश्यकता हो। मान लीजिए कि मैं एक ग्राहक को उपयोगकर्ता रिकॉर्ड के एकल मॉडल के साथ प्रस्तुत करना चाहता हूं? क्या उसे सभी उपयोगकर्ताओं के संग्रह तक भी पहुंच होनी चाहिए? कभी-कभी लोक को अपने usecase को निजी रखने की कोशिश करते समय कुछ सलाह की आवश्यकता होती है। केवल जवाब दो।
एड्रियन बार्थोलोम्यू

0

मैं RESTful url का उपयोग करना चाहता हूं, लेकिन मैं यह नहीं समझ सका कि आधार url में 'पोस्टआईड' क्यों नहीं जोड़ा जा सकता है।

var PostModel = Backbone.Model.extend({
    urlRoot: 'getBlogPost',
    defaults: {
        postTitle: "defaultTitle",
        postTime: "1970-01-01",
        postContent: "defaultContent",
        postAuthor: "anonymous"
    }
});

var post = new PostModel({
            postId: 1
        });
alert(post.url());

तब मुझे पता है कि मैं 'idAttribute' को 'PostId' के रूप में सेट करने के बाद ही मॉडल में सही url प्राप्त कर सकता हूँ। इस तरह:

var PostModel = Backbone.Model.extend({
    idAttribute: 'postId',
    urlRoot: 'getBlogPost',
    defaults: {
        postTitle: "defaultTitle",
        postTime: "1970-01-01",
        postContent: "defaultContent",
        postAuthor: "anonymous"
    }
});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.