【问题标题】:Ember.js Clone an existing record into the storeEmber.js 将现有记录克隆到存储中
【发布时间】:2013-12-09 17:54:25
【问题描述】:

我正在为 Ember.js 喜欢的概念而苦苦挣扎。我想要的是以下内容。我现在有一个名为 Article 的现有 Ember 数据模型。假设 id 为 1 将显示在 /article/1 上。

当用户点击“新建”按钮时,他们会转换到“article.new”路线。查看我的路由器:

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

但是这行不通。我想是因为我的 article.new 路线中需要一条路径。但是,当用户单击“新建”按钮时,我不需要 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);
        });
    },

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

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

    有了这个插件,只需将 Copyable mix-in 添加到要复制的目标模型中并使用复制方法

    来自附加站点的示例

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

    【讨论】:

      【解决方案2】:

      Ember Data 处于测试阶段,因此缺少功能是意料之中的,只有在通过 find 解析时才会从 id 解析关系。

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

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

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

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

      【讨论】:

      • 我奖励了你的榜样。但是,我将我的解决方案添加到上面的问题中。谢谢!
      • @kingpin2k 我也遇到过几次这个问题...... PR 会有什么内容?一个失败的用例?我不太明白。
      • 试图复制记录?还是分配关系?提交带有失败测试用例的 PR 是好的,其中功能已经存在,但存在问题,但是对于新功能,提交带有新功能的 PR 会走得更远。
      • 有没有办法在 createRecord() 方法中获取使用的模型名称,而不用硬编码?我正在使用通用的itemController,并且想这样做。我可以通过this.get("model") 访问模型,所以我假设有类似this.get("model").get("modelName")?
      【解决方案3】:

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

      我有一个“复制”方法:

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

      【讨论】:

        【解决方案4】:

        如果您将“新”路由嵌套在您的编辑下,这样您就不需要在 url 中添加任何额外的参数了。然后要“复制”它,您可以使用 this.modelFor('article')

        到达父路由

        【讨论】:

        • 感谢您的帮助,然后我收到一条错误消息,指出 ID 已存在。我也试过var newArticle = Ember.copy(this.get('model', true))。但这也行不通。我不能接受没有简单的“Emberlike”解决方案。:-) 我会进一步尝试,如果您有任何想法,我想听听!
        • 我也不明白为什么这不起作用:var currentArticle = this.get('model'); currentArticle.set('id', null); var duplicatedArticle = this.store.createRecord('article', currentArticle); duplicatedArticle.save();
        • 这行不通,因为 ember 模型对象不是 JS 对象......所以你不能从现有的对象中创建一个...... createRecord 需要传入一个 JS 对象。
        猜你喜欢
        • 1970-01-01
        • 2015-01-12
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多