2013-03-24 8 views
5

के बीच सबसे अच्छा परिवर्तन के लिए एम्बर घटना है मेरे पास एम्बर सूची और एक संपादन फ़ॉर्म है। प्रत्येक बार जब सूची का चयनित आइटम बदलता है तो संपादन फ़ॉर्म किसी भी बदलाव को छोड़ देता है और नया मॉडल लोड करता है।एम्बर इवेंट एक ही मार्ग

मेरी समस्या यह है कि परिवर्तनों को त्यागने का कोई तरीका नहीं है क्योंकि निष्क्रिय घटना आग नहीं होती है।

उदाहरण के लिए url/favs/123/edit से url/favs/456/edit निष्क्रिय (और बाहर निकलें) ईवेंट आग नहीं है। इसलिए किसी भी बदलाव को सही तरीके से त्यागने का कोई तरीका नहीं है।

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

उत्तर

4

मैं willTransition मार्ग कार्रवाई का उपयोग करने की सलाह देते हैं यहाँ एंबर स्रोत से एक अंश है।

http://emberjs.com/guides/routing/preventing-and-retrying-transitions/

सार्वजनिक एपीआई में किया जा रहा है के अलावा, इस दृष्टिकोण लाभ यह है कि आप इस बात की पुष्टि करने के लिए संकेत कर सकते हैं यदि वे वास्तव में छोड़ना चाहते हैं: यह वर्तमान में एंबर गाइड में समाधान के रूप में विज्ञापन देने के लिए प्रकट होता है परिवर्तन, यदि वे कहते हैं तो संक्रमण को रद्द करना।

उदाहरण के लिए:

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

निष्क्रिय हुक बस जब मार्ग पूरी तरह से छोड़ दिया है निष्पादित किया जाता है:

यहाँ मेरी कोड का हिस्सा मैं की बात कर रहा हूँ। इसलिए मैं आपके रूट के संदर्भडिड चेंज फ़ंक्शन को ओवरराइट करने का सुझाव दूंगा।

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

एंबर युवा है। एक आकर्षण की तरह काम करता है लेकिन डोल रोलबैक कोड इस – Everydaypanos

+0

var नियंत्रक = this.controller, सामग्री = (नियंत्रक? नियंत्रक.get ('सामग्री'): शून्य) की तरह बेहतर हो सकता है; \t \t \t \t अगर (सामग्री && content.get ('IsDirty')) { \t \t content.get ('लेन-देन') रोलबैक()।; } – Everydaypanos

+0

अब अगर उपयोगकर्ता से पूछने के लिए एक HTML संवाद प्रस्तुत करने के लिए केवल मध्यवर्ती राज्य था तो उपयोगकर्ता अद्भुत होगा। फिर भी यह पर्याप्त से अधिक है :) – Everydaypanos

1

एंबर 2.2 सही कोड (मार्ग में) है:

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(); 
    } 
    } 
} 
संबंधित मुद्दे