トランザクションのあるルートを実装しました。ユーザーが「戻る」ボタンをクリックしてこのルートから移動したときに、トランザクションをロールバックすることによって行われた変更の終了と喪失をユーザーが確認できるようにしたいと思います。
問題は、ユーザーがルートに戻ると、Ember Dataが発生し、次のようにエラーが発生することです。
Error: assertion failed: Models cannot belong to more than one transaction at a time.
これは、古いトランザクションでremove()を明示的に呼び出し、新しいトランザクションにadd()を追加している場合でもです(以下のnewTransaction()関数を参照)。
settingsDetails: Ember.Route.extend({
route: '/details',
transaction: MyApp.store.transaction(),
doBackButton: function() {
var dirty = MyApp.router.get('settingsDetailsController.content.isDirty');
var doTransition = true;
if (dirty) {
var confirmDialog = confirm('You have unsaved changes. Are you sure you want to continue ? \n\nAny chances made will be lost!');
doTransition = confirmDialog;
}
if (doTransition) {
this.doResetSettingsDetails();
MyApp.router.transitionTo('settings.settingsOverview');
}
},
newTransaction: function() {
var oldTransaction = this.get('transaction');
var newTransaction = MyApp.store.transaction();
var record = MyApp.router.get('settingsDetailsController').get('content');
if (record) {
oldTransaction.remove(record);
newTransaction.add(record);
}
this.set('transaction', newTransaction);
},
doUpdateSettingsDetails: function() {
this.get('transaction').commit();
this.newTransaction();
},
doResetSettingsDetails: function() {
this.get('transaction').rollback();
this.newTransaction();
},
connectOutlets: function(router) {
router.get('applicationController').connectOutlet('settingsDetails');
var record = MyApp.store.find(MyApp.PersonDetails, 1);
this.get('transaction').add(record);
router.get('settingsDetailsController').set('content', record);
}
}),