0

免责声明:我试图对此做一个 jsfiddle,但如果没有 RESTAdapter 的公共源,我无法真正让它工作。

我有一个带有 hasMany 子模型数组的模型。我需要向这个子数组添加一个新模型并保存到服务器:

App.FooModel = DS.Model.extend({
  'name': DS.attr('string'),
  'bars': DS.hasMany('App.BarModel')
});

App.BarModel = DS.Model.extend({
  'name': DS.attr('string'),
});

App.ApplicationController = Ember.Controller.extend({
  init: function() {
    var foo    = App.FooModel.find(101); // -- currently has bars[201, 202, 203]
    var newBar = loadFixture( App.BarModel, 204 );

    var self = this;
    setTimeout( function() { // -- just to be sure our models are loaded before we try this
      // foo.currentState: saved
      foo.get('bars').addObject(newBar);
      // foo.currentState: saved

      foo.store.commit(); // -- nothing happens
    }, 1000);
  }
});

App = Ember.Application.create({
  store: DS.Store.create({
    revision: 11
  })
});

但什么也没有发生。我的父模型没有被标记为脏,所以商店从不尝试提交。我应该以不同的方式将这种关系添加到父级吗?这是一个错误吗?

当前解决方法:

foo.get('bars').addObject(newBar);

var save = foo.get('name');    
foo.set('name', (save + '!'));
foo.set('name', save); // -- this marks our record as dirty, so a save will actually happen

foo.store.commit();

编辑 1:我知道 ember-data 只会序列化这个数据,如果它是嵌入开始的(https://stackoverflow.com/a/15145803/84762),但我已经覆盖了我的序列化程序来处理这个。我遇到的问题是商店甚至从未尝试保存此更改,因此我们甚至从未访问过序列化程序。

编辑2:我怀疑这可能这个错误有关,但同时这意味着这对任何人都不起作用,我很难相信没有其他人遇到过这个问题。

4

2 回答 2

1

看起来您正在建模一对多关系,但您没有belongsToApp.BarModel. 检查此链接:

http://emberjs.com/guides/models/defining-models/#toc_one-to-many

App.Post = DS.Model.extend({
    comments: DS.hasMany('App.Comment')
});

App.Comment = DS.Model.extend({
    post: DS.belongsTo('App.Post')
});
于 2013-03-06T14:52:23.497 回答
0

据我了解,您没有使用embedded关系功能,而是覆盖了您的序列化程序来处理将bars对象序列化为foo对象。

我认为您的错误可能来自这里:如果您的关系未嵌入,则没有理由将foo对象标记为脏,因为当您将对象添加到他的bars关联时,应该更改的通常是您添加的对象的键foo_idbar那么就没有foo要发送到 API的对象的更改。

于 2013-03-06T10:02:32.723 回答