7

Ho percorsi con segmenti dinamici nidificati, ad esempio nidificazione /:locale/products/:product_id/items/:item_id ecc. Voglio scambiare la locale in un'azione nel percorso locale. Non desidero passare al percorso di base /:locale quando cambio le impostazioni internazionali.ember.js - scambia una risorsa nidificata da qualsiasi percorso

locale azione rotta:

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

Questo funziona solo quando non sono profondamente nidificate. Vorrei evitare di implementare l'azione localeChanged in ogni percorso per fornire i modelli esatti necessari per una determinata rotta.

Update 1 - soluzione sporca:

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

dico sporca perché l'iterazione di this.router.router.currentHandlerInfos sembra soggetto a errori. C'è un modo migliore?

+2

Ha forse senso avere il 'locale' come parametro di query anziché essere parte delle risorse/percorsi? – Kalman

+0

Ciò renderebbe sicuramente più semplice. Non so se sono ancora pronto a concederti. –

+0

Probabilmente anche questo è sporco, ma che ne dici di espressioni regolari che modificano le impostazioni locali sull'intero 'location.pathname' se è sempre la prima parte del percorso? Ember gestirà la risoluzione completa del percorso? – Laurence

risposta

0

È possibile creare un baseRoute che aggiunge questa azione. Quindi tutti i tuoi percorsi potrebbero ereditare da questa rotta di base. Devi solo scrivere il codice una volta, ed è condiviso su tutte le rotte. Per esempio.

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

Tale codice sarebbe già presente sul percorso dell'applicazione. –

Problemi correlati