1

我有以下型号:

App.Parent = DS.Model.extend({
  foo: DS.attr('string'),
  children: DS.hasMany('child', {async: true})
});

App.Child = DS.Model.extend({
  bar: DS.attr('string')
});

我用一些夹具数据填充它们:

App.ApplicationAdapter = DS.FixtureAdapter.extend();

App.Parent.FIXTURES = [
  {
    id:0,
    foo: 'parent',
    children: [0,1]
  }
];

App.Child.FIXTURES = [
  {
    id: 0,
    bar: 'child 0'
  },
  {
    id: 1,
    bar: 'child 1'
  },
  {
    id: 2,
    bar: 'child 2'
  }
];

在对关系进行一些更改后children,如何将关系回滚children到其最新保存的状态?

我通过以下方式将新孩子推送到 manyArray:

this.store.find('child', 2).then(function(child){
  model.get('children').pushObject(child);
})

这确实改变了关系(我在我看来看到新的孩子),但父记录不会变脏。因此,当我尝试时model.rollback(),它什么也不做。我也尝试了我在这里找到的解决方案How to rollback relationship changes in EmberData这是model.send('becomeDirty')在回滚之前添加的,但它没有帮助。

也许我以错误的方式将孩子添加到我的关系中?

谢谢!

4

4 回答 4

2

这是一些将回滚模型的代码,以及我使用的关系:

    var model = this.get('model');
    var relatedModel, relatedModels;
    model.constructor.eachRelationship(function (key, relationship) {
        if (relationship.kind === 'hasMany') {
            relatedModels = model.get(key);
            if (relatedModels) {
                relatedModels.invoke('rollback'); //since this is an array, need to call the rollback function differently
            }
        }
        else {
            relatedModel = model.get(key);
            if (relatedModel) {
                relatedModel.rollback();
            }
        }
    });
    model.rollback();

希望这可以帮助

于 2014-03-18T18:40:16.680 回答
2

我相信这里列出的其他答案只能部分解决这个问题。如果您添加新的相关模型或删除现有模型,回滚也应该反转这些模型,我相信其他答案不能解决这个问题。这是一个完整的解决方案,它为 hasMany 和 belongsTo 关系提供了正确的脏检查和完整的回滚:

https://stackoverflow.com/a/27184207/188740

于 2014-11-28T08:01:21.770 回答
2

我用它来回滚相关的脏记录。

App.ParentRoute = Ember.Route.extend 
  model: ->
    @get('store').createRecord('parent', child: @get('store').createRecord('child'))
  actions:
      willTransition: (transition) ->
        rollbackRecords(@)

rollbackRecords = (context) ->
  if context.get("controller.content.isDirty")
    relationships = Ember.get(App[context.get('controller').resourceName], "relationshipsByName")
    content = context.get('controller.content')
    relationships.forEach (name, relationship) ->
      relatedModel = content.get(name)
      relatedModel.rollback() if relatedModel? and relatedModel.get('isDirty')
    content.rollback()
  true
于 2013-12-04T15:38:04.193 回答
0

我喜欢做好事model.reload() ——它会吹走你没有与你的服务器同步的所有更改。

于 2016-05-17T21:51:06.163 回答