如何在Ember Data中“分叉”模型

时间:2013-11-06 16:02:51

标签: ember.js ember-data

我不确定这是否是表达我的要求的正确方法。但是“fork”这个词出现在Ember Data github页面的路线图中。它是EPF的杀手级功能。我想知道我是否可以在Ember Data中做到这一点。

当我们有一个编辑页面并绑定模型时,fork功能非常有用。当我们编辑信息时,我不希望更改模型属性,因为如果模型属性也显示在其他位置,它们将自动更改。那不是我想要的。

示例是页面左侧的列表和页面右侧特定模型的编辑表单。当我在文本字段中修改角色名称时,由于数据绑定,左侧的角色名称会更改。

enter image description here

EPF通过“分叉”现有模型并将其设置在子会话中来解决此问题。 EPF中的会话与Ember Data中的商店类似。修改分叉模型时,它不会影响主会话中的模型。更新分叉模型后,可以将其合并回主会话,并更新主会话中的相应模型。

我认为Ember Data中的解决方案是创建一个不同的商店并将模型复制到该商店。但它有点复杂。有没有人有更好的解决方案?我搜索了stackoverflow和ember讨论论坛并没有找到答案。

2 个答案:

答案 0 :(得分:1)

我不确定在Ember中是否有标准常见的方式来做这个,但是我已经编写了一个我可以放到我的路线上的Mixin给出一些模型的基本'缓冲':

App.BufferedRouteMixin = Ember.Mixin.create({
    setupController: function(controller, model) {
        this.setBufferFromModel(controller, model);
        this._super(controller, model);
    },
    setBufferFromModel: function(controller, model) {
        var buffer = {};
        controller.set('model', model);
        model.eachAttribute(function(name, meta) {
            buffer[name] = model.get(name);
        });

        controller.set('buffer', buffer);
    },
    setModelFromBuffer: function() {
        var model = this.get('model'),
            buffer = this.get('buffer');

        model.eachAttribute(function(name, meta) {
            if (buffer[name]) {
                model.set(name, buffer[name]);
            }
        });
    }
});

将其添加到我的修改路线后,我可以在setModelFromBuffer操作中致电save。在我的模板中,我可以使用{{#with buffer}}帮助器。

答案 1 :(得分:-1)

我认为最简单的解决方案是使Ember.Object模仿模型的结构。进入编辑模式时,将属性从模型复制到Ember.Object,然后让它们更新,直到用户单击“保存”或您希望将更改合并到哪个操作。我做的一件事是重要的是将mixin Ember.Copyable添加到我的对象中。下面是我用来为自己解决这个问题的一些代码。

注意::此代码是为了防止在提交模型之前创建模型,因此不是编辑,而是创建新模型。

App.SomeModel = DS.Model.extend({
  user: DS.belongsTo('user'),
  home: DS.belongsTo('home'),

  cost: DS.attr('number'),
  title: DS.attr('string'),
  description: DS.attr('string'),
  category: DS.attr('number'),
  categoryName: function () {
    return Roomy.enums.TransactionCategories[this.get('category')]
  }.property('category'),
  date: DS.attr('date', {
       defaultValue: function() { return new Date(); }
  }),
  fuzzyDate: function () {
    return moment(this.get('date')).fromNow();
  }.property('date'),
  split: DS.attr('boolean'),
  contributors: DS.attr('array'),
  points: DS.attr('number')
});

App.SomeModelNew = Ember.Object.extend(Ember.Copyable, {
  user: null,
  home: null,
  cost: null,
  title: null,
  description: null,
  category: null,
  date: new Date(),
  split: false,
  contributors: [],
  points: null,
  copy: function () {
    return this.getProperties('cost', 'title', 'description', 'category', 'date', 'split', 'contributors', 'user', 'home');
}
});

然后为了保存这个模型,我做了这样的事情 注意::由于关系,我必须使用User和Home的代码,只需复制User和Home的json形式就不会保持关系,并为模型提供数据库中所需的ID。

以下控制器代码:

//Before this function is called, all the inputs in the form have been filled in and the instance now has values for all the fields that were defined for it
saveTxn: function (txn) {
    // txn is the App.SomeModelNew instance
    copy = this.store.createRecord('transaction', txn); // this returns the App.SomeModelNew.copy() object
    copy.set('user', txn.get('user')); // OVerwrite user for relationship
    copy.set('home', txn.get('home')); // Overwrite home for relationship
    return copy.save();
}

我希望这会有所帮助。