在ember.js中复制嵌套模型(成功保存后)

时间:2015-01-12 14:02:09

标签: javascript ember.js model ember-data

我有模型广告系列,其中包含模型故事和域名。

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方法之前,我看到模板上有重复的域和故事)。当我进行页面编辑活动时,我也看到了重复的域名和故事。 AFTER刷新页面 - 我看到正常数据(刷新此数据是从服务器获取的)。

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-data 1.0.0-beta.14.1

2 个答案:

答案 0 :(得分:1)

我认为你遇到了一个问题reported

我不得不降级到ember-data 1.0.0-beta.12

答案 1 :(得分:1)

关于故事(故事的id在客户端生成)我使用了this.store.push 而不是this.store.createRecord - 这工作正常。

关于我理解的域名 - 这是bug ember.js。在github上,我发现了几个关于这个bug的讨论。

现在我使用一个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');
})