我正在努力应对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();
除belongsTo
和hasMany
属性外,最后一次尝试都有效。
没有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%和我一样的问题)
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);
});
},
答案 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')到达父路线