2012-07-16 36 views
4

很抱歉,如果這是一個有點令人費解......我仍然在學習Backbone.js的...如何在Backbone.js中加載具有外鍵關係的子模型?

什麼是加載&保存有自身內子模型骨幹模型的正確方法? (應該我甚至是具有子模型?)

例如,(原諒的CoffeeScript),如果我有這樣的:

class Address extends Backbone.Model 
    urlRoot: '/api/v1/address/' 
    url: -> return @[email protected]+'/?format=json' 
    defaults: {'city': '', 'state': ''} 

class Person extends Backbone.Model 
    urlRoot: '/api/v1/person/' 
    url: -> return @[email protected]+'/?format=json' 
    defaults: { name: 'Anon', address: new Address } 

... and then I do this ... 

dude = new Person 
dude.set('id',101) 
dude.fetch() 
// Response returns {name: 'The Dude', address: '/api/v1/address/1998/'} 
// And now, dude.get('address') is '/api/v1/address/1998' and no Address object 

where = new Address 
where.set('id',1998) 
where.fetch() 
// Response returns {city: 'Venice', state; 'CA'} 

我想要什麼就是dude.fetch( ),併爲它得到了兄弟和他的地址,當我打電話給Backbone.sync('更新',夥計)時,我想保存這個傢伙和他的地址。怎麼樣?

在後端,我使用tastypie構建我的API對於一些SQLAlchemy的表(不Django的ORM),所以我有我的個人表和地址表的資源:

class AddressResource(SQLAlchemyResource): 
    class Meta: 
     resource_name = 'address' 
     object_class = AddressSQLAlchemyORMClass 

class PersonResource(SQLAlchemyResource): 
    address = ForeignKey(AddressResource, 'address') 
    class Meta: 
     resource_name = 'person' 
     object_class = PersonSQLAlchemyORMClass 

Tastypie的ForeignKey功能創建一個映射,將的URL返回到相關地址。

我試圖重載Dude.parse()函數來調用獲取的地址(),但它不工作了,感覺錯了,它提出了各種各樣的問題:

  1. 我應該修改我的tastypie響應以將地址作爲嵌套對象包含在內?
  2. 如果我改變爲一個嵌套的對象,我應該使用backbone-relational,如在問題Backbone-Relational related models not being created,或者是過度殺傷?
  3. 我應該是overloading the parse()或fetch()函數或創建自己的backbone.Sync()來獲取響應,然後手動執行此操作?
  4. 由於它是一對一的,我應該只需要一個模型而不是子模型,並且在一個請求中一起發回信息?

有沒有這樣做的標準方法?

回答

3

隨着Tastypie,可以將響應改變爲作爲一個嵌套的對象,而不是一個連結,通過在ForeignKey的定義指定充分=真

class PersonResource(SQLAlchemyResource): 
    address = ForeignKey(AddressResource, 'address', full=True) 

這與沿返回地址對象人。

接下來,我仍然不知道如果這是最好的方式,但我動了我的分型出的屬性和重載解析()來設置它,和update()來保存它,像:

class Person extends Backbone.Model 
    address: new Address 
    urlRoot: '/api/v1/person/' 
    url: -> return @[email protected]+'/?format=json' 
    defaults: { name: 'Anon'} 

    parse: (response) -> 
    addressResp = response.address || {} 
    addressAttr = @address.parse(addressResp) 
    @address.set(addressAttr) 
    return response 

    update: (options) -> 
    @set('address',@address.toJSON()) 
    Backbone.sync 'update', @, options 

在這個例子中,我可以重新添加地址的屬性,並設置管理/獲取,但隨後在自己的環境中,我創建了一個備用的toJSON函數的JSON發佈到服務器,並且找不到將json設置爲對象而不將其從集合更改爲json響應的好方法。

相關問題