Подтвердить что ты не робот

Выполнение отката по модели с hasMany отношением

У меня есть модели, определяемые как:

App.Answer = DS.Model.extend({
    name: DS.attr('string'),
    layoutName: DS.attr('string')
});

App.Question = DS.Model.extend({
    name: DS.attr('string'),
    answers: DS.hasMany('answer', {async: true})
});

У меня есть компонент, который позволяет удалять и добавлять ответы на вопросную модель. Компонент поставляется с кнопкой приложения и отмены, и когда пользователь нажимает на отмену, я хотел, чтобы все изменения (добавления/удаления ответов) были отменены. В настоящее время откат не делает трюк, я событие пробовал model.reload() при использовании адаптера отдыха, и это тоже не сработало для меня. Любая идея, как я могу сделать откат в этой ситуации?

При использовании адаптера для отдыха я в значительной степени опускаю проблему, указанную здесь: Объект отмены EmberJS (отката) с HasMany

Спасибо, Dee

ОБНОВЛЕНИЕ:

Так как я не мог выполнить откаты предполагаемым способом, я выполнил следующие шаги:

1) get all the answers back from the server
2) remove answer association from the question
3) manually add answer association to the question model from data received from server

Кажется, что это хорошо работает, но, к сожалению, я получаю эту ошибку, которую я не могу стряхнуть.

Вот jsbin обновленного хода: http://jsbin.com/uWUmUgE/2/

Здесь вы можете создать новый ответ, а затем добавить его к вопросу и выполнить откат. НО, если вы выполните следующие шаги, вы увидите проблему, с которой я сталкиваюсь:

1) delete an answer
2) add an answer
3) perform rollback
4) add an answer

Он выдает эту ошибку: Ошибка: попытка обработать событие didSetProperty при включенном состоянии root.deleted.uncommitted. Вызывается с помощью {name: position, oldValue: 1, originalValue: 1, value: 2}.

Я буду ценить любую помощь, которую вы можете предоставить.

обходным:

Один простой способ - просто скрыть ответы на удаление. Я немного изменил модель:

App.Answer = DS.Model.extend({
    name: DS.attr('string'),
    layoutName: DS.attr('string'),
    markToDelete: DS.attr('boolean', {default: false})
});

И моя функция отката имела такую ​​логику:

answers.forEach(function (answer) {
    if(!answer.get('id')){
        //newly created answer models that has not persisted in DB
        question.get('answers').removeObject(answer);
        answer.deleteRecord();
    } else {
        answer.rollback();
    }
});
4b9b3361

Ответ 1

Я не уверен в вашей сфере видимости, но для этих отношений (я фактически откатываю свой список здесь, но мне любопытно, помогает ли это в любом случае)

   App.Appointment = DS.Model.extend({
        name: DS.attr('string'),
        customer: DS.belongsTo('customer', {async: true})
    });

    App.Customer = DS.Model.extend({
        name: DS.attr('string'),
        appointments: DS.hasMany('appointment', {async: true})
    });

Я могу отменить оба назначения, и у него есть модель клиента, подобная так (из моего маршрута)

App.AppointmentRoute = Ember.Route.extend({
actions: {
  willTransition: function(transition) {
    var context = this.get('context');
    var dirty =context.get('isDirty');
    var dirtyCustomer=context.get('customer.isDirty');  
    var message = "foo";
    if ((dirty || dirtyCustomer) && confirm(message)) {
        transition.abort();
    }else{
        context.get('customer').get('content').rollback();
        context.rollback();return true;
    }
}
});