2012-03-01 9 views
12

का उपयोग करके मैंने बैकबोन.जेएस के साथ प्रयोग करना शुरू कर दिया है, और बैकबोन.मोडेल पर url प्रॉपर्टी के लिए प्रलेखन के लिए प्रलेखन द्वारा मारा गया था।हैटओएएस और बैकबोन.जेएस

विशेष रूप से, मैं एक आरईएसटी एपीआई तैयार कर रहा हूं जो क्लाइंट को चलाने के लिए हैटओएएस/हाइपरमीडिया का उपयोग करता है।

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

क्या कोई इसे करने के लिए बैकबोन पर विस्तारित/बनाया गया है? हो सकता है कि HAL जैसे "मानक" पर निर्माण हो?

संपादित करें:

स्पष्टीकरण के लिए, मान लीजिए कि मैं निम्नलिखित है:

प्राप्त/आदेश >>

[ 
    { 
    "_links": { 
     "self": "/orders/123" 
    } 
    "name": "Order #123", 
    "date": "2012/02/23" 
    }, 
    { 
    "_links": { 
     "self": "/orders/6666" 
    } 
    "name": "Order #666", 
    "date": "2012/03/01" 
    }, 
] 

और मैं की तरह एक आदेश मॉडल है:

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

मुझेचाहिएसंपत्ति को एचएएल में "स्वयं" संदर्भ से स्वचालित रूप से खींचा जा सकता है। मुझे लगता है कि एक नया आधार मॉडल बनाना (परीक्षण नहीं किया गया):

var HalModel = Backbone.Model.extend({ 
    url: function() { 
    return get("_links").self; 
    }, 
}); 

विचार?

+0

क्या आप कह रहे हैं कि यदि आपके पास ऑर्डर मॉडल है कि आप यूआरएल को 'ऑर्डर/{ऑर्डरिड}' के लिए गतिशील रूप से सेट करना चाहते हैं और यदि आपके पास ग्राहक मॉडल है, तो वही कोड इसे 'ग्राहक/{ग्राहक' } '? – timDunham

+0

@timDunham अधिक स्पष्टीकरण के लिए मेरे संपादन देखें। – Pete

उत्तर

4

स्पष्टीकरण @Pete के लिए धन्यवाद।

मुझे लगता है कि मैं देखता हूं कि आपका प्रस्ताव क्या है और मुझे लगता है कि यह काम कर सकता है। हालांकि, आपके उदाहरण में, आपको आदेश प्राप्त करने में सक्षम होने से पहले आपको पहले /Orders यूआरएल पता होना था। और यदि आपने अपने जेसन को id संपत्ति के लिए फिर से काम किया है, तो आप रीढ़ की हड्डी के डिफ़ॉल्ट कार्यान्वयन के बहुत करीब होंगे।

अब यदि आप सिर्फ एक सामान्य मॉडल या बेस मॉडल (उदाहरण के लिए HALModel) का उपयोग करना चाहते हैं और इसे डेटा के साथ बूटस्ट्रैप करना चाहते हैं, तो आपका दृष्टिकोण उपयोगी हो सकता है और निश्चित रूप से काम कर सकता है। हालांकि, मैं parse अधिभावी यूआरएल बाहर निकालते हैं और मॉडल पर यह स्थापित करने के लिए पर दिखेगा:

parse: function(response) { 
    this.url = response._links.self; 
    delete response._links; 
    return response; 
} 
+0

हां, पता/ऑर्डर यूआरएल सेवा के लिए आधार यूआरएल में एक जीईटी से आता है, जो एक हेटोएस दृष्टिकोण का उपयोग कर सभी उपलब्ध संसाधनों के लिए लिंक वापस कर देगा: GET/>> {"_links": {"urn: mysite। कॉम: ऑर्डर ":"/ऑर्डर "} – Pete

+0

मुझे पार्स फ़ंक्शन का उपयोग पसंद है। क्या मुझे बैकबोन.मोडेल.प्रोटोटाइप.परसे.call (यह, प्रतिक्रिया) के साथ आधार पार्स विधि तक श्रृंखला बनाने की आवश्यकता है; ? – Pete

+1

चेन अप करना जरूरी नहीं है। डिफ़ॉल्ट रूप से 'पार्स' वापसी 'प्रतिक्रिया'। – timDunham

1

आप यूआरएल की गणना करने के लिए मॉडल पर यूआरएल फ़ंक्शन को ओवरराइड कर सकते हैं, हालांकि आप चाहते हैं; यह पूरी तरह से विस्तार योग्य है।

+0

हाँ, मैंने देखा है कि मैं इसे किसी विशेष मॉडल के लिए मैन्युअल रूप से ओवरराइड कर सकता हूं। मैं उत्सुक हूं अगर किसी के पास एक अधिक सामान्य/पुन: प्रयोज्य दृष्टिकोण है जो उन्होंने लिया है। – Pete

10

मैं रीढ़ की हड्डी का विस्तार किया है वास्तव में ऐसा करने के लिए, पुस्तकालय यहाँ उपलब्ध है:

https://github.com/mikekelly/backbone.hal

2

मैं साइमन की प्रतिक्रिया यहां समझाता हूं कि gomoob/backbone.hateoas का उपयोग करके इसे आसानी से कैसे किया जाए।

// Instanciation of an Hal.Model object is done the same way as you're 
// used to with a standard Backbone model 
var user = new Hal.Model({ 
    firstName: "John", 
    lastName: "Doe", 
    _links: { 
     avatar: { 
      href: "http://localhost/api/users/1/avatar.png" 
     }, 
     self: { 
      href: "http://localhost/api/users/1" 
     } 
    }, 
    _embedded: { 
     address: { 
      "city" : "Paris", 
      "country" : "France", 
      "street" : "142 Rue de Rivoli", 
      "zip" : "75001", 
      "_links" : { 
       "self" : { 
        "href" : "http://localhost/api/addresses/1" 
       } 
      } 
     } 
    } 
}); 

// Now we you can easily get links, those lines are equivalent 
var link1 = user.getLink('avatar'); 
var link2 = user.getLinks().get('avatar'); 

// So getting self link is simple too 
var self = user.getLink('self'); 

// All the Hal.Link objects returned by backbone.hateoas are in fact 
// standard Backbone models so its standard Backbone 
link1.get('href'); 
link1.getHref(); 

// You can do more with shortcut methods if your HAL links 
// have more properties 
link1.get('deprecation'); 
link1.getDeprecation(); 
link1.get('name'); 
link1.getName(); 
link1.get('hreflang'); 
link1.getHreflang(); 
link1.get('profile'); 
link1.getProfile(); 
link1.get('title'); 
link1.getTitle(); 
link1.get('type'); 
link1.getType(); 
linke1.get('templated'); 
link1.isTemplated(); 

// You can also manipulate embedded resources if you need 
user.getEmbedded('address').get('city'); 
user.getEmbedded('address').getLink('self'); 
... 

अंत में हम एक Hal.Model.url() कार्यान्वयन जो मानक बैकबोन यूआरएल() और जो बहुत उपयोगी है अगर आप एचएएल का उपयोग से अधिक शक्तिशाली है प्रदान करते हैं।

// By default url() returns the href of the self link if this self 
// link is present 
user.url(); 

// If the self link is not defined then url() has the same behavior 
// as standard Backbone url() method 
// My user is link to a user collection having a URL equal to 
// 'http://localhost/user1' 
user.url(); // http://localhost/users/1 

// My user is not link to a user collection in this case the URL is 
// generate using the model urlRoot property by default 
user.urlRoot = 'http://myserver/users'; 
user.url(); // http://localhost/users/1 

// backbone.hateoas also allows you to define an application wide root 
// URL which prevent to use absolute URLs everywhere in your code 
Hal.urlRoot = 'http://localhost/api'; // HAL root API URL 

var user = new Hal.Model({ id : 1}); 
user.urlMiddle = 'users'; 
user.url(); // http://localhost/api/users/1 

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

संबंधित मुद्दे