7

मेरे पास नेस्टेड गतिशील सेगमेंट के साथ मार्ग हैं, उदाहरण के लिए /:locale/products/:product_id/items/:item_id आदि घोंसले। मैं लोकेल मार्ग में एक कार्रवाई में लोकेल को स्वैप करना चाहता हूं। जब मैं लोकेल बदलता हूं तो मैं बेस /:locale रूट पर संक्रमण नहीं करना चाहता हूं।ember.js - किसी भी मार्ग से एक नेस्टेड संसाधन को स्वैप करें

स्थान मार्ग कार्रवाई:

actions: { 
    localeChanged: function(locale) { 
    var route = this.controllerFor('application').get('currentRouteName'); 
    this.transitionTo(route, locale); 
    } 
} 

यह केवल काम करता है जब मैं गहराई से नहीं लगाए गए कर रहा हूँ। मैं दिए गए मार्ग के लिए आवश्यक सटीक मॉडल प्रदान करने के लिए प्रत्येक मार्ग में localeChanged कार्रवाई को लागू करने से बचना चाहता हूं।

अद्यतन 1 - गंदा समाधान:

actions: { 
    localeChanged: function(locale) { 
    var routes = this.router.router.currentHandlerInfos; 
    var models = []; 
    for (var i = 0; i < routes.length; i++) { 
     var params = routes[i].params; 
     for (var param in params) { 
     if (params.hasOwnProperty(param)) { 
      models.push(param === 'locale' ? locale : params[param]); 
     } 
     } 
    } 

    var args = models.slice(); 
    var currentRouteName = this.controllerFor('application').get('currentRouteName'); 
    args.unshift(currentRouteName); 
    this.transitionTo.apply(this, args); 
    } 
} 

मैं गंदा कहना क्योंकि this.router.router.currentHandlerInfos से अधिक पुनरावृत्ति त्रुटियों की संभावना लगती है। क्या कोई बेहतर तरीका है?

+2

क्या संभवतः संसाधनों/मार्गों के हिस्से के रूप में आपके 'लोकेल' को क्वेरी पैरा के रूप में रखना समझ में आता है? – Kalman

+0

यह निश्चित रूप से इसे आसान बना देगा। मुझे नहीं पता कि मैं अभी तक स्वीकार करने के लिए तैयार हूं या नहीं। –

+0

यह शायद गंदा भी है, लेकिन पूरे 'location.pathname' पर लोकेल को संशोधित करने के बारे में कैसे है यदि यह हमेशा पथ का पहला हिस्सा है? क्या एम्बर पूरे रूट रिज़ॉल्यूशन को संभालेगा? – Laurence

उत्तर

0

आप एक बेस रूट बना सकते हैं जो इस क्रिया को जोड़ता है। तब आपके सभी मार्ग इस मूल मार्ग से प्राप्त हो सकते हैं। आपको केवल एक बार कोड लिखना होगा, और यह सभी मार्गों पर साझा किया जाता है। उदाहरण के लिए।

App.BaseRoute = Ember.Route.extend({ 
    actions: { 
    localeChanged: function(locale) { 
    var routes = this.router.router.currentHandlerInfos; 
    var models = []; 
    for (var i = 0; i < routes.length; i++) { 
     var params = routes[i].params; 
     for (var param in params) { 
     if (params.hasOwnProperty(param)) { 
      models.push(param === 'locale' ? locale : params[param]); 
     } 
     } 
    } 
    var args = models.slice(); 
    var currentRouteName = this.controllerFor('application').get('currentRouteName'); 
    args.unshift(currentRouteName); 
    this.transitionTo.apply(this, args); 
    } 
    }}); 


App.SomeRoute = BaseRoute.extend(); 
+0

वह कोड पहले से ही एप्लिकेशन मार्ग पर होगा। –

संबंधित मुद्दे