5

トランザクションのあるルートを実装しました。ユーザーが「戻る」ボタンをクリックしてこのルートから移動したときに、トランザクションをロールバックすることによって行われた変更の終了と喪失をユーザーが確認できるようにしたいと思います。

問題は、ユーザーがルートに戻ると、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);
    }
}),
4

1 に答える 1

0

Ember Dataのベータ版以降、EmberDataにはトランザクションがありません。したがって、この質問はもはや関係ありません。

于 2014-04-23T22:19:33.083 に答える