16

現在編集中のモデルのクローンを作成したい。

ほとんど機能するいくつかの方法を見つけました。しかし、どちらも完璧ではありません。

1)model.get('data.attributes')キャメルケース形式の関係を除くすべての属性を取得し、新しいレコードを正常に生成しますが、もちろん関係はありません。

2)model.serialize()関係を含むすべての属性を持つ JSON オブジェクトを生成します。ただしcreateRecord、オブジェクトがキャメルケースではないため、うまく処理されません (アンダースコアのような属性はfirst_name処理されません)。

クローンが作成された後transaction.createRecord(App.Document, myNewModelObject)、いくつかの属性を変更/設定し、最後にcommit(). 誰でもこれを行う方法について洞察を持っていますか?

4

7 に答える 7

5

これで、モデルをコピーするアドオンができました ember-cli-copyable

このアドオンではCopyable、コピーするターゲット モデルに mix-in を追加し、copy メソッドを使用するだけです。

アドオン サイトの例

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) 

});
于 2015-09-11T07:52:23.690 に答える
3

このように serialize() の代わりに toJSON() メソッドを使用するのはどうですか

js transaction.createRecord(App.Document, model.toJSON());

于 2013-08-27T14:31:02.637 に答える
-1

ここに更新された回答がありますが、まだ関係を処理していませんhasMany

cloneBelongsTo: function(fromModel, toModel) {
  var relationships;
  relationships = Em.get(fromModel.constructor, 'relationships');
  return relationships.forEach(function(relationshipType) {
    var _relType;
    _relType = relationships.get(relationshipType);
    return _relType.forEach(function(relationship) {
      var name, relModel;
      relModel = Em.get(fromModel, relationship.name);
      if (relationship.kind === 'belongsTo' && relModel !== null) {
        name = relationship.name;
        return toModel.set(name, fromModel.get(name));
      }
    });
  });
}

そして、これが私がそれを使用する方法です:

// create a JSON representation of the old model
var newModel = oldModel.toJSON();
// set the properties you want to alter
newModel.public = false;
// create a new record
newDocument = store.createRecord('document', newModel);
// call the cloneBelongsTo method after the record is created
cloneBelongsTo(model, newDocument);
// finally save the new model
newDocument.save();
于 2013-02-16T17:44:36.027 に答える