Ember.js将现有记录克隆到商店

时间:2013-12-09 17:54:25

标签: ember.js ember-data

我正在努力应对Ember.js的概念。我想要的是以下内容。我现在有一个名为Article的现有Ember数据模型。可以说,id的{​​{1}}将显示在/article/1

当用户点击“新建”按钮时,他们将转换为“文章”。路线。看我的路由器:

App.Router.map(function () {
   this.resource('article', {path: '/article/:id'});
   this.resource('article.new', {path: "/article/new"});
}

当用户点击重复按钮时,/article/1会调用duplicateArticle操作。我直观地在App.ArticleController中执行以下操作:

duplicateArticle: function () {
   return this.transitionToRoute('article.new', this.get('model');
}

然而,这是行不通的。我想因为我需要一条路径在我的文章中。新路线。但是,当用户单击“新建”按钮时,我不需要ID。

这个问题有效吗?

编辑:我到目前为止的尝试:

var currentArticle = this.get('model'); 
currentArticle.set('id', null); 
var duplicatedArticle = this.store.createRecord('article', currentArticle); 
duplicatedArticle.save();

var duplicatedArticle = Ember.copy(this.get('model'), true);

和:

 var newArticle = JSON.parse(JSON.stringify(this.get('model')));
 var duplicatedArticle = this.store.createRecord('article', newArticle);
 duplicatedArticle.save();

belongsTohasMany属性外,最后一次尝试都有效。

没有Ember方式这样做吗?

参考文献:

Ember clone model for new record

Is there any way to convert Ember Object into plain javascript object?

Iterating over Ember.js ember-data Record Arrays

How can I clone an Ember Data record, including relationships?(没有回答,75%和我一样的问题)

更新:一个简单示例,还包含 belongsTo 项目

hasMany不起作用。如果您有解决方案,请参与此答案!

我没有hasMany项目的最终解决方案现在如下:

在我的ArticleController的行动中:

  duplicateArticle: function () {
        var article = this.get('model').toJSON(),
            self = this;

        // todo implement saving hasMany items

        // set belongsTo items by hand
        article['landcode'] = this.get('landcode');
        article['employee'] = this.get('employee');
        article['cross_selling_article_relation'] = this.get('cross_selling_article_relation');

        var duplicatedArticle = this.store.createRecord('article', article);

        // save and transite to newly created article
        duplicatedArticle.save().then(function (savedArticle) {
            self.transitionToRoute('article', savedArticle.id);
        });
    },

4 个答案:

答案 0 :(得分:4)

现在我们有了一个复制模型ember-cli-copyable

的插件

使用此附加功能,只需将Copyable混合添加到要复制的目标模型并使用复制方法

来自附加网站的示例

import Copyable from 'ember-cli-copyable';

Account = DS.Model.extend( Copyable, {
  name: DS.attr('string'),
  playlists: DS.hasMany('playList'),
  favoriteSong: DS.belongsTo('song')
});

PlayList = DS.Model.extend( Copyable, {
  name: DS.attr('string'),
  songs: DS.hasMany('song'),
});

//notice how Song does not extend Copyable 
Song = DS.Model.extend({
  name: DS.attr('string'),
  artist: DS.belongsTo('artist'),
});
//now the model can be copied as below
this.get('currentAccount.id') // => 1 
this.get('currentAccount.name') // => 'lazybensch' 
this.get('currentAccount.playlists.length') // => 5 
this.get('currentAccount.playlists.firstObject.id') // => 1 
this.get('currentAccount.favoriteSong.id') // => 1 

this.get('currentAccount').copy().then(function(copy) {

  copy.get('id') // => 2 (differs from currentAccount) 
  copy.get('name') // => 'lazybensch' 
  copy.get('playlists.length') // => 5 
  copy.get('playlists.firstObject.id') // => 6 (differs from currentAccount) 
  copy.get('favoriteSong.id') // => 1 (the same object as in currentAccount.favoriteSong) 

});

答案 1 :(得分:3)

Ember Data处于测试阶段,因此缺少预期的功能,只有通过find解析后才能从ID中解析关系。

如果你创建了一个虚拟id,你可以pushPayload然后找到。

无关系,您可以使用record.toJSON()获取没有id的属性,然后将其发送到createRecord。

http://emberjs.jsbin.com/OxIDiVU/13/edit

您应该提交一份具有重复逻辑的PR,这将是为社区做出贡献的好方法。

答案 2 :(得分:2)

我有一个复制/复制Ember数据记录的解决方案,包括它的一对多关系。

我有一个“重复”的方法:

duplicate: function(oldObject) {
  var newObject = oldObject.toJSON();
  for (var key in newObject) {
    if (newObject[key] != oldObject.get(key)) {
        newObject[key] = oldObject.get(key);
    }
  }
  newObject.id = null;
  return newObject;
}

我在这样的动作中使用这个方法:

actions: {
  draft: function() {
    var newModel = this.duplicate(this.get('model'));
    this.store.createRecord('somemodel', newModel).save();
  }
}

答案 3 :(得分:1)

如果您在编辑下嵌套了“新”路线,那么您在网址中不需要任何额外的参数。然后“复制”它你可以使用this.modelFor('article')到达父路线