Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js 余烬数据模型应保存非余烬数据模型的ID-如何保存?_Ember.js_Ember Data - Fatal编程技术网

Ember.js 余烬数据模型应保存非余烬数据模型的ID-如何保存?

Ember.js 余烬数据模型应保存非余烬数据模型的ID-如何保存?,ember.js,ember-data,Ember.js,Ember Data,我有一个模型,它应该将客户端已知模型的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

我有一个模型,它应该将客户端已知模型的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
在适配器中:

DS.MyAdapter.registerTransform('recordArray',
  deserialize: (serialized) ->
    console.log('this does not work', serialized)
  serialize: (deserialized) ->
    deserialized.map((item) -> item.get('id'))
)
接下来我要尝试的是创建一个虚拟数组属性来关联浏览器对象,再加上一个观察者,该观察者将它们的ID保存到与api同步的数组中。这必须是双向的,因为加载的Thingie对象在从api(而不仅仅是ID)加载时应该具有可用的关联对象

这种方法将奏效。假设适配器将
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索引到对象数组中。它将完全忽略UI.Browser对象的
id
属性


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

谢谢,这对我有很大帮助。不幸的是,我必须处理的ID不是顺序的,但我认为我可以在将数组传递给registerEnumTransform时“欺骗”它们,使其具有正确的索引。是的,这应该是可能的。对于支持id查找的转换来说可能是有意义的,它将给出一些想法。。。
DS.MyAdapter.registerEnumTransform('browsers', App.Browser.all);
App.Thingie = DS.Model.extend({
  browsers: DS.hasMany 'browsers'
})