2015-08-19 2 views
0

Я добавляю объекты к свойству массива модели, а затем сохраняю его. Когда я смотрю на исходящий запрос, рассматриваемое свойство всегда является пустым массивом.Сериализация массива Ember

Мой заказ сериализатору (расширение 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); 
    }); 

Я могу подтвердить, что в момент сохранения, пост объект имеет массив 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') 
    }); 

ответ

1

Там нет построена в DS.attr('array') и наивная реализация могла бы, вероятно, не знает, как сериализовать объекты уголька-данные, найденные внутри. Ты собирался оставить это там? Если поменять его обратно на отношения, которые вы комментировали, и изменить 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

+0

На самом деле это унаследованное приложение, оно использует более старую версию данных ember и пытается ее обновить. Когда я использовал правильные отношения и встроенные записи, у меня были всевозможные проблемы, когда он пытался перезагрузить данные с сервера (не могу установить свойство readonly для «id») и т. Д. И т. Д. Короткий вариант - мне нужно заставить его отправить исходный текст json для этого массива. –

+0

Я не понимаю, почему, даже если я передаю произвольные данные методу сериализации, он не использует его. Что мне не хватает по этому поводу? –

+0

@TobyTremayne Вы проверили, вызывается ли 'serialize'? Является ли атрибут вообще не сериализованным или просто пустым '[]'? Вы отказались от того, что этот атрибут сериализуется в сериализаторе модели? Кажется, что это нормально для других людей: http://stackoverflow.com/a/19557708/29347 –

0

Если массив не содержит сложный объект, например массив строк, вы можете использовать DS.attr(), он будет работать.

Смежные вопросы