Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ember.js-从任何路由交换嵌套资源_Javascript_Ember.js_Url Routing_Single Page Application - Fatal编程技术网

Javascript ember.js-从任何路由交换嵌套资源

Javascript ember.js-从任何路由交换嵌套资源,javascript,ember.js,url-routing,single-page-application,Javascript,Ember.js,Url Routing,Single Page Application,我有嵌套动态段的路由,例如/:locale/products/:product\u id/items/:item\u id等嵌套。我想在区域设置路由中的操作中交换区域设置。当我更改区域设置时,我不想转换到基本/:locale路由 区域设置路由操作: actions: { localeChanged: function(locale) { var route = this.controllerFor('application').get('currentRouteName');

我有嵌套动态段的路由,例如
/:locale/products/:product\u id/items/:item\u id
等嵌套。我想在区域设置路由中的操作中交换区域设置。当我更改区域设置时,我不想转换到基本
/:locale
路由

区域设置路由操作:

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);
  }
}
操作:{
localeChanged:函数(区域设置){
var routes=this.router.router.currentHandlerInfos;
var模型=[];
对于(变量i=0;i

我之所以说dirty,是因为迭代
this.router.router.currentHandlerInfos
似乎容易出错。有更好的方法吗?

您可以创建一个添加此操作的baseRoute。然后,您的所有路由都可以从该基本路由继承。你只需要写一次代码,它在所有路径上都是共享的。比如说

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();
App.BaseRoute=Ember.Route.extend({
行动:{
localeChanged:函数(区域设置){
var routes=this.router.router.currentHandlerInfos;
var模型=[];
对于(变量i=0;i
将您的
区域设置作为查询参数而不是作为资源/路线的一部分是否有意义?这肯定会使它更容易。我不知道我是否已经准备好让步了。这可能也是肮脏的,但是如果regex始终是路径的第一部分,那么如何修改整个
位置上的区域设置。pathname
?恩伯会处理完整的路线解决方案吗?