2013-03-24 6 views
5

Bir Ember listesi ve bir düzenleme formum var. Listenin seçili öğesi düzenleme formunu her değiştirdiğinde, herhangi bir değişiklik yapılmaz ve yeni model yüklenir.Aynı rota arasındaki değişiklikleri en uygun şekilde kaldırmak için Ember olayı

Sorunum, devre dışı bırakma olayı tetiklenmediği için değişiklikleri atmanın bir yolu olmamasıdır. Örneğin, url/favs/123/edit adresinden url/favs/456/edit 'a gidiş devreden çıkmak (ve çıkmak) olayı ateş etmez. Yani herhangi bir değişikliği doğru şekilde atmanın bir yolu yoktur.

App.Router.map(function() { 
    this.resource('favs', { path: '/favs' }, function() { 
     this.route('new'); 
     this.route('edit', { path: ':fav_id/edit' }) 
    }); 
}); 

[...] 

App.FavsEditRoute = Ember.Route.extend({ 
    deactivate: function() { 
     var model = this.get('currentModel'); 
     if(model && model.get('isDirty')) { 
      model.get('transaction').rollback(); 
     } 
    }, 

    model: function(params) { 
     return App.Fav.find(params.fav_id); 
    }, 
}); 

cevap

4

Ben willTransition rota eylemini kullanarak öneriyoruz İşte Kor Kaynak bir alıntıdır.

Kenara kamu API olmaktan http://emberjs.com/guides/routing/preventing-and-retrying-transitions/

, bu yaklaşım aslında terk etmek istiyorsanız onaylamak için kullanıcıyı uyararak avantajı vardır: Şu anda Kor Kılavuzu'nda çözüm olarak reklamı gibi görünüyor değişim, eğer hayır diyorlarsa geçişi geçersiz kılarlar. Örneğin

: Sihirli 2.2 (rota) doğru kod olarak

App.FavsEditRoute = Ember.Route.extend({ 
    ... 
    actions: { 
    willTransition: function(transition) { 
     controller = this.controllerFor('fav'); 
     if (controller.get('isDirty') && 
      !confirm("Are you sure you want to abandon progress?")) { 
     transition.abort(); 
     return false; 
     } else { 
     controller.get("content").rollback(); 
     return true; 
     } 
    } 
    } 
}); 
2

rota tamamen bırakıldığında devreden çıkarmak kanca sadece yürütülür: Burada

bahsettiğim benim kod parçasıdır. Bu nedenle, Rotanızın contextDidChange işlevinin üzerine yazılmasını öneririm. Bunu yapmak öneririm

Ember.Route = Ember.Object.extend({ 
    /** 
    @private 

    Called when the context is changed by router.js. 
    */ 
    contextDidChange: function() { 
    this.currentModel = this.context; 
    } 
}); 

:

App.FavsEditRoute = Ember.Route.extend({ 
    deactivate: function() { 
     this.doRollback(); 
    }, 
    contextDidChange: function() { 
     this.doRollback(); 
     this._super(); 
    }, 
    doRollback: function(){ 
     var model = this.get('currentModel'); 
     if(model && model.get('isDirty')) { 
      model.get('transaction').rollback(); 
     } 
    } 
}); 
+0

Kor gençtir. Bir çekicilik gibi çalışır ancak doRollback kodu bu gibi daha iyi olabilir – Everydaypanos

+0

var controller = this.controller, content = (controller? Controller.get ('content'): null); \t \t \t \t halinde (içerik && content.get ('IsDirty')) { \t \t content.get ('işlem') geri alma (.); } – Everydaypanos

+0

Şimdi, kullanıcılardan harika olmasını istemek için bir HTML iletişim kutusu sunmak için bir ara durum olsaydı. Yine de bu daha fazla :) – Everydaypanos

1

olup:

actions: { 
    saveScene: function (scene) { 
    var _that = this; 

    scene.save().then(function (response) { 
     // on saveScene action, go to list route 
     _that.transitionTo('scenes'); 
    }); 
    }, 

    willTransition: function (transition) { 
    // on transition, if model has unsaved changes, revert them 
    var model = this.controller.get('model'); 
    if (model && model.get('hasDirtyAttributes')) { 
     model.rollbackAttributes(); 
    } 
    } 
}