3

假设我有两个模型,Book并且Chapter.

App.Book = DS.Model.extend
  name: DS.attr 'string'
  chapters: DS.hasMany 'chapters', async: true

App.Chapter = DS.Model.extend
  name: DS.attr 'string'
  book: DS.belongsTo 'book', async: true

使用 emberFire。

App.ApplicationAdapter = DS.FirebaseAdapter.extend
  firebase: new Firebase('http://<my-firebase>.firebaseio.com/')

App.ApplicationSerializer = DS.FirebaseSerializer.extend()

根据有关关系的文档,使用该async: true选项,Firebase 会期望我的数据如下所示。

{
  'books': [{
    'book_id_1': {
      'name': 'Example',
      'chapters': [{
        'chapter_id_1': true
      }]
  }],
  'chapters': [{
    'chapter_id_1': {
      'name': 'Chapter 1'
    }
  }]
}

我可以保存一个Chapter就好了,但是我似乎无法获得chapters一个Book填充了新创建的Chapter.

在 Chrome 控制台中:

var store = App.__container__.lookup('store:main')
store.find('book', 'book_id_1').then(function(b) { window.book = b });

var chapter = store.createRecord('chapter', { name: 'Chapter 1' });

chapter.save().then(function() {  // Saves the chapter
  book.get('chapters').then(function(chapters) {
    chapters.addObject(chapter);
    book.save();  // Doesn't append to the chapters object
  }
});

上面的代码并没有按照我期望的方式保存chapters属性。book任何帮助,将不胜感激。


编辑

看起来将chapter对象添加到book.chapters属性的正确方法是:

book.get('chapters').then(function(chapters) {
  chapters.addObject(chapter);
  book.save().then(function() {
    chapter.save();
  });
});

但是如果对象上存在验证错误chapter,它将被添加到book.chapters属性中但不会被保存(创建无效引用)。你如何解决这个问题?

4

1 回答 1

2

Ember-Data 有一个奇怪的细微差别,如果某个关系从一个关系定义为 ahasMany并且相应的记录定义为 abelongsTo它只发送属性,如果它是belongsTo. 话虽如此,您需要致电chapter.save(). 我真的很讨厌这个,我之前也抱怨过,但我一直懒得提交拉取请求。

于 2014-04-05T05:03:43.617 回答