对不起,如果这有点令人费解......我还在学习 Backbone.js......
加载和保存本身具有子模型的 Backbone 模型的正确方法是什么? (我什至应该有子模型吗?)
例如,(请原谅 coffeescript),如果我有类似的东西:
class Address extends Backbone.Model
urlRoot: '/api/v1/address/'
url: -> return @urlRoot+@id+'/?format=json'
defaults: {'city': '', 'state': ''}
class Person extends Backbone.Model
urlRoot: '/api/v1/person/'
url: -> return @urlRoot+@id+'/?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('update',dude) 时,我想要保存这家伙和他的地址。怎么办?
在后端,我使用 tastypie 为一些 SQLAlchemy 表(不是 Django 的 ORM)构建我的 api,因此我有一个用于我的 Person 表和 Address 表的资源:
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() 函数来为 Address() 调用 fetch,但它没有用,而且感觉不对,它引发了各种各样的问题:
- 我是否应该修改我的 tastypie 响应以将地址作为嵌套对象包含在内?
- 如果我更改为嵌套对象,我应该使用 backbone-relational 吗? , 如问题 Backbone-Relational related models not being created ,或者这是矫枉过正?
- 我应该overloading the parse()或 fetch() 函数或创建我自己的 backbone.Sync() 来获取响应然后手动执行此操作?
- 既然它是一对一的,我是否应该只使用一个模型而不是子模型,然后在一个请求中一起发回信息?
是否有执行此操作的标准方法?
最佳答案
使用 Tastypie,您可以通过在 ForeignKey 定义中指定 full=True 将响应更改为嵌套对象,而不是链接:
class PersonResource(SQLAlchemyResource):
address = ForeignKey(AddressResource, 'address', full=True)
这会返回地址对象和人。
接下来,我仍然不知道这是否是最好的方式,但我将我的子模型移出了属性,并重载了 parse() 来设置它,并更新了()保存它,例如:
class Person extends Backbone.Model
address: new Address
urlRoot: '/api/v1/person/'
url: -> return @urlRoot+@id+'/?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
在这个例子中,我可以将地址添加回属性并使用 set/get 来管理它,但是在我自己的环境中,我已经为 json 创建了一个备用的 toJSON 函数来发布到服务器,并且不能'找到一个很好的方法来将 json 设置为对象,而不会将其从集合更改为 json 响应。
关于jquery - 如何在 Backbone.js 中加载具有外键关系的子模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11502614/