Ember数组序列化

时间:2015-08-19 07:00:00

标签: arrays serialization ember.js

我将对象添加到模型的数组属性中,然后保存它。当我查看传出请求时,有问题的属性始终是一个空数组。

我的自定义序列化程序(扩展Ember.RESTSerializer)具有:

DS.ArrayTransform = DS.Transform.extend(
    {
        deserialize: function(serialized)
        {
            return (Ember.typeOf(serialized) == "array") ? serialized : [];
        },

        serialize: function(deserialized)
        {
            var type = Ember.typeOf(deserialized);
            if (type == 'array')
            {
                return [{foo:'bar'}];
                // return deserialized;
            }
            else if (type == 'string')
            {
                return deserialized.split(',').map(function(item)
                {
                    return item.trim();
                });
            }
            else
            {
                return [];
            }
        }
    });
App.register("transform:array", DS.ArrayTransform);

正如你所看到的那样,我已经尝试传回一个带有对象的任意数组,但即使这样,数组也总是空出来。在应用程序中,我创建了这样的记录:

  var post = this.store.createRecord('explorePost', {
    title: content.get('title'),
    text: content.get('text'),
    postDate: content.get('postdate'),
    publishDate: content.get('publishDate'),
    published: content.get('published'),
    postType: content.get('postType'),
    link: content.get('link,'),
    projectDownloads: [],
    // projectDownloads: this.model.get('projectDownloads'),
    projectLinks: content.get('projectLinks'),
  });

然后添加如下对象:

this.model.get('projectDownloads').forEach(function (_download) {
    console.log('pushing download', _download);
    post.get('projectDownloads').pushObject(_download);
  });

我可以确认,在保存时,post对象有一个projectDownloads数组,其中包含一个对象。无论我做什么,我似乎无法在保存时吐出内容。它肯定会进入自定义序列化程序,并将其检测为数组,但您可以看到其他内容似乎覆盖了它。

谁能告诉我自己做错了什么?我的模型设置如下:

    App.ExplorePost = DS.Model.extend(
    {
        title: DS.attr('string'),
        text: DS.attr('string'),
        link: DS.attr('string'),
        postDate: DS.attr('momentdate'),
      publishDate: DS.attr('momentdate'),
      user: DS.belongsTo('user',{async:true}),
      postType: DS.attr('string'),
        activity: DS.belongsTo('activity',{ inverse: 'explorePost', async:true}),
        comments: DS.hasMany('comment',{ inverse: 'explorePost', async: true }),
        // projectDownloads: DS.hasMany('projectDownload',{ inverse: 'explorePost'}),
        projectDownloads: DS.attr('array'),
        // projectLinks: DS.hasMany('projectLink',{ inverse: 'explorePost'}),
        projectLinks: DS.attr('string'),
        published: DS.attr('boolean', {defaultValue: true}),
      // tags: DS.hasMany('tag')

        sortdate: function()
        {
            var datestr = Ember.isEmpty(this.get('postDate')) ? '' : moment(this.get('postDate')).format('YYYYMMDDHHmm');
            var fn = (datestr + '____________').slice(0, 12);
            return fn;
        }.property('postDate')
    });

2 个答案:

答案 0 :(得分:1)

没有内置DS.attr('array'),一个天真的实现可能不知道如何序列化内部发现的ember-data对象。你打算把它留在那里吗?如果您将其交换回您已注释掉的关系并更改projectDownloads以使用该承诺:

this.model.get('projectDownloads').then(function(downloads) {
  downloads.forEach(function(_download){
    post.get('projectDownloads').pushObject(_download);
  });
});

这应该可以正常工作。前几天我把几乎相同的东西放在一起。 http://emberjs.jsbin.com/zolani/3/edit?html,css,js,output

答案 1 :(得分:0)

如果你的数组不包含复杂的对象,比如字符串数组,你可以使用DS.attr(),它会起作用。