5

我正在使用 Ember 1.0-pre4。

我有两个一对一关系的模型:

App.Lesson = DS.Model.extend                               
  timeslot: DS.belongsTo 'App.Timeslot'

App.Timeslot = DS.Model.extend
  lesson: DS.belongsTo 'App.Lesson'

我有一个适配器配置为在保存时将时间段嵌入到课程中:

App.Adapter = DS.RESTAdapter.extend()  

App.Adapter.map App.Lesson,    
  timeslot: { embedded: 'always' }             

App.Store = DS.Store.extend            
  revision: 11                                 
  adapter: App.Adapter.create()       

然后我创建一个课程和一个时间段并尝试保存它们:

lesson = App.Lesson.createRecord
  group: group
lesson.set('timeslot', App.Timeslot.createRecord())

lesson.store.commit()

但是在保存后没有嵌入任何内容,我看到 POST 请求,一个用于课程,一个用于时间段。

如何告诉 Ember 始终将时间段嵌入到课程中?

4

1 回答 1

3

我认为这是一个错误,您应该报告它。筛选源代码并进行一些测试表明createRecord根本没有考虑embedded配置。此配置仅用于序列化和反序列化过程。

当您调用 createRecord 时,会将一条记录添加到存储桶中created,然后在commit ember-data存储桶中的每条记录上简单地触发一个 ajax 发布。

因此,要回到您的代码中ember-data,您创建了两条记录,并且在提交时它将触发对其中的Lesson对象的 ajax 发布调用Timeslot embedded,并且还将在随后的调用中为Timeslot最后剩余的记录触发另一个 ajax 发布在桶里。

lesson = QrTimetable.Lesson.createRecord
  group: group

lesson.set('timeslot', QrTimetable.Timeslot.createRecord())
lesson.store.commit()

除非,对 ember-data 内部有更好理解的人与我的观点相矛盾,否则我倾向于再次相信这是一个错误。

这是提交事务时调用的最后一个代码。

  createRecord: function(store, type, record) {
    var root = this.rootForType(type);

    var data = {};
    data[root] = this.serialize(record, { includeId: true });

    this.ajax(this.buildURL(root), "POST", {
      data: data,
      context: this,
      success: function(json) {
        Ember.run(this, function(){
          this.didCreateRecord(store, type, record, json);
        });
      },
      error: function(xhr) {
        this.didError(store, type, record, xhr);
      }
    });
  },
于 2013-01-28T16:53:57.343 回答