2014-09-08 2 views
0

Мы используем Ember-Data со стандартным RestAdapter и до сих пор так хороши. Мы можем сохранять объекты с отношениями OneToOne и ManyToMany, но когда мы пытаемся сохранить объект с отношением OneToMany, любые объекты, добавленные во многие стороны, будут отбрасываться при вызове save(). Код ниже:Проблемы с сохранением отношений OneToMany в Ember.js

В 2 модели:

Ember.Owner = DS.Model.extend({ 
    name: DS.attr('string'), 
    pets: DS.hasMany('pet', {async: true}); 
}); 

Ember.Pet = DS.Model.extend({ 
    name: DS.attr('string'), 
    owner: DS.belongsTo('owner', {async: true}); 
}); 

код контроллера:

actions: { 

     save: function() { 

      var self = this; 

      var petSaved = function(pet) { 

       // Create the owner 
       var owner = self.store.createRecord ('owner', { 
         name: 'Walt', 
       }); 

       // Add the new pet then save the owner 
       owner.get('pets').then(function(pets) { 
        pets.addObject(pet); 
        // Logging the owner at this point shows that pet has been added and has been assigned an id from the DB 
        owner.save(); 
        // Logging the owner at this point shows no pets 
       }); 
      }; 

      // Create the pet 
      var pet = this.store.createRecord('pet', { 
       name: 'Lassie', 
      }); 

      // Save the pet 
      pet.save().then(petSaved); 
     }, 
    }, 

Используя код, по существу, аналогичный приведенному выше, мы можем успешно сохранить ManyToMany и OneToOne отношения, но по какой-то причине этот код не работает. После многого Google, мы прочитали, что это либо ошибка EmberData, либо явное дизайнерское решение Ember по соображениям эффективности, но последнее не имеет смысла, так как многие отношения ToMany могут быть сохранены таким образом.

Мы будем очень благодарны за понимание этой проблемы и ее устранение, пожалуйста?

ответ

1

Вам необходимо указать DS.EmbeddedRecordsMixin в ваш App.OwnerSerializer.

Это должно выглядеть примерно так ...

App.OwnerSerializer = DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, { 
    attrs: { 
    pets: {serialize: 'ids', deserialize: 'ids'} 
    } 
}) 
+0

Спасибо за ваш ответ, но вы можете объяснить, почему это необходимо, пожалуйста? – RunLoop

+0

Короткий ответ заключается в том, что существует множество комбинаций сериализации и десериализации, которые могут произойти на основе используемого api. Таким образом, Ember Data позволяет вам выбрать способ, которым вы хотите, чтобы он работал. Но я согласен с тем, что по умолчанию должно быть 'serialize: 'ids''. – tikotzky

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