0

我有一个模型应该将客户端已知模型的 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

到目前为止我已经尝试过:

  1. 用 registerTransform 编写一个自定义的 Ember Data 序列化器,它映射到每个需要保存的对象的对象 id 并保存结果数组。这适用于创建对象,但反序列化步骤不起作用,因为您不知道在反序列化期间将 id 映射到哪个对象(该信息在那里不可用)。示例见 [1]。
  2. 尝试破解 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'))
)
4

1 回答 1

0

接下来我要尝试的是创建一个用于关联浏览器对象的虚拟数组属性,以及一个将它们的 id 保存到与 api 同步的数组中的观察者。这必须双向工作,因为加载的 Thingie-Objects 在从 api 加载时应该具有可用的关联对象(而不仅仅是 ids)。

这种方法会奏效。假设您的适配器将序列化browserIds到/从整数数组,只需browserIds在模型中定义为计算属性。就像是:

App.Thingie = DS.Model.extend({
  browserIds: function(key, value) {
    // getter
    if (arguments.length === 1) {
      return this.get('browsers').getEach('id');
    // setter
    } else {
      return value.map( function(id) {
        App.Browser.find(id);
      });
    }
  }.property('browsers')
})

但是,也许有一种更简单的方法来实现我正在做的事情?

是的,我认为您正在寻找的是(枚举转换)[https://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/adapter.js#L575-L605]。像这样的东西应该工作:

DS.MyAdapter.registerEnumTransform('browsers', App.Browser.all);
App.Thingie = DS.Model.extend({
  browsers: DS.hasMany 'browsers'
})

这里要记住的一件事是转换期望 id 成为对象数组的索引。它将完全忽略id您的 UI.Browser 对象的属性。

另请参阅(枚举转换测试)[https://github.com/emberjs/data/blob/master/packages/ember-data/tests/integration/transform_test.js#L133-L169]

于 2013-06-18T13:06:21.947 回答