2011-07-05 16 views
6

में गहरा घोंसला वाले मॉडल कैसे बनाएं, प्रत्येक ए को मानते हुए 0 या अधिक बी है और प्रत्येक बी में 0 या अधिक सी आइटम हैं। बैकबोन.जेएस (v0.5) में इस संबंध को कैसे पेश किया जाएगा। मैं यूआरएल/ए/ए/बी/बी/सी/सी जैसे यूआरएल रखना चाहता हूं। निम्नलिखित कोड कॉफ़ीस्क्रिप्ट में है। मैं उलझन में हूं, फॉलो कोड में यूआरएल चर सेट कैसे करें।Backbone.js v0.5

class As extends Backbone.Collection 
    url: "/A" 
    model: A 

class A extends Backbone.Model 
    initialize: -> 
    @Bs = new Bs() 
    @[email protected] 
    @Bs.url="/A/#{@id}" 

class Bs extends Backbone.Collection  
    model: B 

class B extends Backbone.Model 
    initialize: -> 
    @Cs = new Cs() 
    @Cs.url = ??? # => /A/a/B/b/C/ 
    @[email protected] 

class Cs extends Backbone.Collection 
    model: C 

class C extends Backbone.Model 
    url: #?? url => /A/a/B/b/C/c 

उत्तर

7

मैं नेस्टेड यूआरएल नहीं बनाऊंगा जब तक कि आपके पास वास्तव में इसके लिए कोई अच्छा मामला न हो। प्रत्येक संसाधन को संसाधन नाम और आईडी द्वारा परिभाषित किया जा सकता है। वस्तुओं के बीच संबंध आंतरिक है।

http://foo.com/a/:id.json 
http://foo.com/b/:id.json 
http://foo.com/c/:id.json 

कहा जा रहा है कि नेस्टेड ऑब्जेक्ट्स को खींचने के लिए सर्वर पर बहुत सारी हिट वास्तव में आदर्श नहीं हैं। बेहतर होगा कि तुम एक भी संसाधन है कि नेस्टेड json

http://foo.com/a/:id.json 

रिटर्न उदाहरण के लिए कर रहे हैं डेटा मैं अपने सर्वर से वापस पाने के लग रहा है उप नोड्स

तरह
{ 
    "id": 372, 
    "context": "office_work", 
    "date_of_entry": "2011-7-05 15:22:00", 
    "blood_glucose_measurement": 98, 
    "food": { 
    "exchanges": "98", 
    "list": "burger fries" 
    }, 
    "exercise": { 
    "duration": "28", 
    "list": "running shopping" 
    } 
} 

है कि व्यक्ति लेता है एक कस्टम नियंत्रक द्वारा इकट्ठे होते हैं डीबी रिकॉर्ड और डेटा का एक पेड़ बनाता है।

हालांकि आप क्योंकि backbone.js देशी रूप केवल फ्लैट संरचनाओं का समर्थन करता है मुसीबत में हैं। मैंने संरचनाओं जैसे प्रसंस्करण पेड़ का समर्थन करने के लिए बुनियादी बैकबोन में कुछ संशोधन किए हैं। मॉडल।

यदि यह आपके लिए उपयोग किया जा सकता है तो मैं इसे यहां पेस्ट कर दूंगा।

#= require jquery 
#= require underscore 
#= require backbone 
# 
class RailsModel extends Backbone.Model 

    initialize: (attributes) -> 
    data = {} 

    for k,v of @attributes 
     if v.constructor.name == "Object" 
     data[k] = new RailsModel(v) 

    @set data, {silent: true} 

    get: (field)-> 
    val = @ 
    first = true 
    for p in field.split('/') 
     if first 
     val = super(p) 
     else 
     # This allows returning *undefined* rather 
     # than an exception if the parent of a deeply 
     # nested node does not exist. 
     val = if val? then val.get(p) else undefined 
     first = false 
    val 

    # Allow heirarchical setting of objects 
    # 
    # Example 
    # 
    # model.set_field('root/child', 10) 
    # 
    # Will create the path if it does not exist 
    set_field: (field, value, silent=false)-> 
    path = field.split('/') 

    node = undefined 
    val = @ 
    for p in field.split('/') 
     node = val 
     val = node.get(p) 
     if not val? 
     data = {} 
     val = new RailsModel 
     data[p] = val 
     node.set data 

    data = {} 
    data[p] = value 
    node.set data 

    if not silent and /\//.test(field) 
     @trigger("change:#{field}", @model, value) 
     @trigger("change", @model) 

window.RailsModel = RailsModel 

आप की तरह

model = new RailsModel 
model.url = "/data" 
model.fetch() 
model.get('excercise/duration') 
model.set_field('excercise/duration', 25) 

अंतिम पंक्ति के लिए इसका इस्तेमाल कर सकते हैं एक घटना को ट्रिगर किया जाएगा "परिवर्तन: अभ्यास/अवधि"