在 ember.js 上复制嵌套模型(成功保存后)
Duplicating nested models on ember.js (after successfull save)
我有模型活动,其中包含嵌套的模型故事和域。
App.Campaign = DS.Model.extend({
name: DS.attr('string'),
stories: DS.hasMany('story'),
domains: DS.hasMany('domain')
});
App.Domain = DS.Model.extend({
domain: DS.attr('string'),
campaigns: DS.hasMany('campaign')
});
App.Story = DS.Model.extend({
title: DS.attr('string'),
campaign: DS.belongsTo('campaign')
});
在控制器中,我以这种方式创建 currentCampaign:
this.currentCampaign = this.store.createRecord('campaign');
并以这种方式添加故事和域:
var campaignDomains = this.get('currentCampaign.domains');
var domainObj = this.store.createRecord('domain', {
"domain": domain
});
campaignDomains.addObject(domainObj);
var campaignStories = this.get('currentCampaign.stories');
var story = this.store.createRecord('story', {
"id": this.generateUUID(), // Generate uniqid
"title": storyTitle,
});
campaignStories.pushObject(story);
保存后(在调用 transitionTo 方法之前,我在模板上看到重复的域和故事)。当我进入页面编辑活动时,我还看到了重复的域和故事。刷新页面后 - 我看到正常数据(通过刷新,此数据正在从服务器获取)。
POST请求JSON(域ID在服务器端生成,故事ID在客户端生成):
{"campaign":
{
"id":"f0777f1a17deadcb",
"name":"name of campaign",
"stories":[{
"id":"488b6b6bf4c988f0",
"title":"story",
"campaign":"f0777f1a17deadcb"
}],
"domains":[{
"domain":"domain.com",
"campaigns":["f0777f1a17deadcb"]}
}]
}
响应 POST 请求(通过添加新活动):
{"campaign":
{
"id":"f0777f1a17deadcb",
"name":"name of campaign",
"stories":[{
"id":"488b6b6bf4c988f0",
"title":"story",
"campaign":"f0777f1a17deadcb"
}],
"domains":[{
"id":"54",
"domain":"domain.com",
"campaigns":["f0777f1a17deadcb"]}
}]
}
序列化器文件
App.CampaignSerializer = DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
attrs: {
domains: {embedded: 'always'},
stories: {embedded: 'always'}
}
});
Ember 1.8.1
Ember-数据 1.0.0-beta.14.1
我认为你 运行 遇到了我 reported 的问题。
我不得不降级到 ember-data 1.0.0-beta.12
关于故事(故事的 id 在客户端生成)我使用 this.store.push
而不是 this.store.createRecord - 这很好用。
据我了解,关于域 - 这是错误 ember.js。在 github 上,我发现了几个关于这个错误的讨论。
现在我使用一个 hack 来避免重复数据,我希望将来这个 bug 会被修复,我删除我的 hack。
var self = this;
this.get('currentCampaign').save().then(function() {
self.get('currentCampaign.domains').toArray().forEach(function(domain) {
if (domain.get('isNew')) {
domain.deleteRecord();
}
});
self.transitionToRoute('campaigns');
})
我有模型活动,其中包含嵌套的模型故事和域。
App.Campaign = DS.Model.extend({
name: DS.attr('string'),
stories: DS.hasMany('story'),
domains: DS.hasMany('domain')
});
App.Domain = DS.Model.extend({
domain: DS.attr('string'),
campaigns: DS.hasMany('campaign')
});
App.Story = DS.Model.extend({
title: DS.attr('string'),
campaign: DS.belongsTo('campaign')
});
在控制器中,我以这种方式创建 currentCampaign:
this.currentCampaign = this.store.createRecord('campaign');
并以这种方式添加故事和域:
var campaignDomains = this.get('currentCampaign.domains');
var domainObj = this.store.createRecord('domain', {
"domain": domain
});
campaignDomains.addObject(domainObj);
var campaignStories = this.get('currentCampaign.stories');
var story = this.store.createRecord('story', {
"id": this.generateUUID(), // Generate uniqid
"title": storyTitle,
});
campaignStories.pushObject(story);
保存后(在调用 transitionTo 方法之前,我在模板上看到重复的域和故事)。当我进入页面编辑活动时,我还看到了重复的域和故事。刷新页面后 - 我看到正常数据(通过刷新,此数据正在从服务器获取)。
POST请求JSON(域ID在服务器端生成,故事ID在客户端生成):
{"campaign":
{
"id":"f0777f1a17deadcb",
"name":"name of campaign",
"stories":[{
"id":"488b6b6bf4c988f0",
"title":"story",
"campaign":"f0777f1a17deadcb"
}],
"domains":[{
"domain":"domain.com",
"campaigns":["f0777f1a17deadcb"]}
}]
}
响应 POST 请求(通过添加新活动):
{"campaign":
{
"id":"f0777f1a17deadcb",
"name":"name of campaign",
"stories":[{
"id":"488b6b6bf4c988f0",
"title":"story",
"campaign":"f0777f1a17deadcb"
}],
"domains":[{
"id":"54",
"domain":"domain.com",
"campaigns":["f0777f1a17deadcb"]}
}]
}
序列化器文件
App.CampaignSerializer = DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
attrs: {
domains: {embedded: 'always'},
stories: {embedded: 'always'}
}
});
Ember 1.8.1 Ember-数据 1.0.0-beta.14.1
我认为你 运行 遇到了我 reported 的问题。
我不得不降级到 ember-data 1.0.0-beta.12
关于故事(故事的 id 在客户端生成)我使用 this.store.push 而不是 this.store.createRecord - 这很好用。
据我了解,关于域 - 这是错误 ember.js。在 github 上,我发现了几个关于这个错误的讨论。
现在我使用一个 hack 来避免重复数据,我希望将来这个 bug 会被修复,我删除我的 hack。
var self = this;
this.get('currentCampaign').save().then(function() {
self.get('currentCampaign.domains').toArray().forEach(function(domain) {
if (domain.get('isNew')) {
domain.deleteRecord();
}
});
self.transitionToRoute('campaigns');
})