【问题标题】:How to add a new many relationship to parent model?如何向父模型添加新的多关系?
【发布时间】:2013-02-20 14:24:02
【问题描述】:

免责声明:我试图对此做一个 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:我怀疑这可能this bug有关,但同时这意味着这对任何人都不起作用,我有很难相信没有其他人遇到过这种情况。

【问题讨论】:

    标签: javascript model-view-controller ember.js javascript-framework ember-data


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      看起来您正在建模一对多关系,但您没有在 App.BarModel 上包含 belongsTo 选项。看看这个链接:

      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')
      });
      

      【讨论】:

      • 在孩子身上添加belongsTo 不起作用,但在孩子身上添加hasMany 可以。他们都没有工作似乎很奇怪。也许我对belongsTo 做错了什么。无论如何,谢谢你——给孩子添加关系似乎是诀窍。我似乎记得某处现在支持 hasMany/null 关系/反向?如果没有,有计划吗?在我的特定情况下,子 bar 对象在应用程序中无处不在 使用,我真的不希望将 25 个不同的关系添加到子对象以使父对象保存。
      • Github 上有一个反空分支。也许他们正在朝着这个方向努力? github.com/emberjs/data/tree/inverse-null
      • 我还在 OP 中留下了关于链接的 SO 问题的评论。如果你能去看看,那就太好了!
      猜你喜欢
      • 2013-03-30
      • 2014-08-17
      • 2015-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      • 2020-03-09
      相关资源
      最近更新 更多