我有一个模型应该将客户端已知模型的 id 作为数组保存到服务器,但我正在努力寻找实现这一目标的好方法。
这是客户端已知的模型类,因此不应与服务器同步:
App.Browser = Em.Object.extend
name: ''
id: 0
App.Browser.reopenClass
all: [
UI.Browser.create(id: 1, name: 'Firefox')
UI.Browser.create(id: 2, name: 'Chrome')
]
find: (id) ->
if arguments.length == 0
return @all
else
@all.find((item) -> item.get('id') == id)
同步到服务器的模型如下所示:
App.Thingie = DS.Model.extend
browserIds: DS.hasMany 'UI.Browser' # <-- this does not work, of course
到目前为止我已经尝试过:
- 用 registerTransform 编写一个自定义的 Ember Data 序列化器,它映射到每个需要保存的对象的对象 id 并保存结果数组。这适用于创建对象,但反序列化步骤不起作用,因为您不知道在反序列化期间将 id 映射到哪个对象(该信息在那里不可用)。示例见 [1]。
- 尝试破解 ember-data 以接受与非 ember-data 模型的关联,但没有运气。
接下来我要尝试的是创建一个用于关联浏览器对象的虚拟数组属性,以及一个将它们的 id 保存到与 api 同步的数组的观察者。这必须双向工作,因为加载的 Thingie-Objects 在从 api 加载时应该具有可用的关联对象(而不仅仅是 ids)。
但是,也许有一种更简单的方法来实现我正在做的事情?非常感谢您的帮助。
[1] 在模型中:
DS.attr 'recordArray', { defaultValue: [] }
在适配器中:
DS.MyAdapter.registerTransform('recordArray',
deserialize: (serialized) ->
console.log('this does not work', serialized)
serialize: (deserialized) ->
deserialized.map((item) -> item.get('id'))
)