2011-07-05 17 views
6

各Aは0以上のBを持ち、各Bは0以上のC個の項目を持つと仮定します。この関係をBackbone.js(v0.5)にどのように提示しますか?私は/ A/A/B/b/C/cのようなURLを持っていたいと思います。次のコードはcoffeescriptにあります。私は混乱している、どのように次のコードでURL変数を設定する。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

本当に良いケースがない限り、ネストされたURLは作成しません。各リソースは、リソース名とIDで定義できます。オブジェクト間の関係は内部的です。

http://foo.com/a/:id.json 
http://foo.com/b/:id.json 
http://foo.com/c/: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" 
    } 
} 

ようになりますたとえば、ネストされたJSONを返す単一のリソース

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

を持っていますdbレコードを作成し、データツリーを作成します。

backbone.jsは本質的にフラットな構造だけをサポートしているので、今は困っています。私は基本的なBackbone.Modelをいくつか変更して、ツリーのような構造をサポートするようにしました。

もしあなたが役に立つのであれば、ここに貼り付けます。

#= 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) 

のようにそれを使用することができます

関連する問題