Правильный способ сохранения отношения hasMany с использованием данных ember

У меня есть некоторые связанные модели в моем приложении ember.js(с использованием Ember 1.0 и EmberData 1.0 RC2):

App.List = DS.Model.extend({
    listName : DS.attr( ),
    cards : DS.hasMany( 'card', { async : true } )
});

и

App.Card  = DS.Model.extend({
    description : DS.attr(  ),
    list : DS.belongsTo( 'list' )
});

Я использую следующий код для сохранения моделей и добавления их в hasMany.

createCard : function(){
    var list = this.get( 'model' ),
        card ;

    card = this.store.createRecord( 'card', {
        description : this.get( 'cardDescription' ),
        list : list
    } );

    card.save().then( function(){
        var cards = list.get( 'cards' );

        cards.then( function(){
            cards.pushObject( card );
            list.save();
        } );
    } );

    this.set( 'cardDescription', '' );
}

Я выполняю прерывистые проблемы при сохранении родительского элемента коллекции hasMany. Иногда карты добавляются в коллекцию списков должным образом (списки имеют массив идентификаторов карты), а иногда карты добавляются некорректно (списки имеют массив объектов карты), и иногда отношения теряются вместе (списки не содержат массив карт).

Эти симптомы заставляют меня думать, что это проблема асинхронности или что я неправильно использую promises при сохранении объектов.

Ответы

Ответ 1

Это выглядит примерно так же, как я использовал здесь. Единственное различие, которое я вижу, это то, что я подтолкнул дочернюю модель к родительскому за один шаг (что, я сомневаюсь, имеет значение), а также получил комментарий (который, я думаю, это карта в вашем случае), как предмет обещания внутри функция "then", может быть, это имеет значение?

var post = this.get('controllers.post.content');
var comment = this.get('store').createRecord('comment', { post: post, text: this.get('text') });
comment.save().then(function(comment){
  post.get('comments').pushObject(comment);
});

Ответ 2

Для текущей последней EmberData 1.0.0-beta.4+canary.3993001d я сделал это только при создании в созданном режиме didCreate hook для каждого связанного с ней отношения. Работает до сих пор...

App.Book = DS.Model.extend({
  ...
  didCreate: function() {
    var self = this;
    Em.RSVP.resolve(this.get('author')).then(function(author){
      author.get('books').pushObject(self);
    });
    Em.RSVP.resolve(this.get('category')).then(function(category){
      category.get('books').pushObject(self);
    });
  },
  ...
});