如何添加一个新的关系到父模型?

免责声明:我试图做一个这样的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:我知道,只有嵌入数据(https://stackoverflow.com/a/15145803/84762)时,ember-data才会序列化这些数据,但我已覆盖我的序列化程序来处理此问题。 我遇到的问题是,商店甚至从未尝试保存此更改,因此我们甚至从未访问序列化程序。

编辑2:我怀疑这可能与这个bug有关,但同样意味着这对任何人都不适用,而且我很难相信没有人遇到过这个问题。


它看起来像你建模一对多的关系但你不包括belongsTo的选项App.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')
});

据我所知,你没有使用关系的embedded特性,而是重写了你的序列化器来处理bars对象到foo对象的序列化。

我认为你的bug可能来自这里:如果你的关系没有嵌入,没有理由将foo对象标记为dirty,因为当你添加一个对象到他的bars关联时,应该改变的通常是你添加的bar对象的关键foo_id ,那么foo对象不会发送到API。

链接地址: http://www.djcxy.com/p/65575.html

上一篇: How to add a new many relationship to parent model?

下一篇: data: Loading hasMany association on demand