2014-01-10 2 views
18

У меня есть модели, определенные как:выполняет откат на модели с 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}) 
}); 

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

При использовании адаптера покоя, я в значительной степени падение к вопросу указал здесь: EmberJS cancel (rollback) object with HasMany

Спасибо, Ди

UPDATE:

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

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(); 
    } 
}); 

ответ

2

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

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}) 
    }); 

Я могу откатить как назначение и это hasMany модель клиент, как так (внутри моего маршрута)

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; 
    } 
} 
}); 
+0

Hi @Toran благодарит за ответ. Когда я пытаюсь получить контекст из моего компонента, который обрабатывает откат, он возвращает сам экземпляр компонента. Что вы получаете в контексте вашего дела? –

+0

ах, извините, мой пример из-за маршрута (я еще ничего не сделал с компонентом, поэтому я не уверен, как это будет похоже/или нет) –

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