在Ember获取当前路线名称

时间:2013-08-18 18:38:35

标签: ember.js

我需要在我的ember应用程序中获取当前路由名称;我试过这个: Ember App.Router.router.currentState undefined 但它对我不起作用(有可能是我想念的东西......)我使用Ember rc6并且我有一个多语言应用程序;在applicationRoute中,我检测到浏览器的语言,然后使用以下命令重定向到正确的页面:

this.transitionTo(userLang);

但我希望只有当用户在主页上时才能执行此操作,所以这样:

if (currentRoute == 'home'){
  this.transitionTo(userLang)
}

10 个答案:

答案 0 :(得分:25)

这对我来说在1.3.0-beta上工作(快速浏览1.1.2的来源表明它也可以在那里工作):

App.__container__.lookup('router:main').location.lastSetURL

请注意,文档说明:

  

目前,它依赖于浏览器中存在的hashchange事件。

但是,我认为强烈建议不要在生产代码中使用App.__container__。更可接受的替代方案是使用App.Router.router.currentHandlerInfos,它提供有关当前Ember路线的信息。

currentRouteName上的另一个选项是ApplicationController。您可以将needs: ['application']添加到控制器,然后使用controllers.application.currentRouteName访问路由名称。这将返回posts.index

之类的内容

答案 1 :(得分:17)

您可以观察application的{​​{1}},并在其发生变化时将其设置为当前路线:

currentPath

这样,您可以随时使用App = Ember.Application.create({ currentPath: '', }); App.ApplicationController = Ember.Controller.extend({ updateCurrentPath: function() { App.set('currentPath', this.get('currentPath')); }.observes('currentPath') }),

访问currentPath

E.g。

App.get('currentPath');

希望它有所帮助。

答案 2 :(得分:17)

随着向组件的转变,获取路由名称变得更加困难。最好的方法是添加初始化程序,例如

ember g initializer router

(来自命令行)和

export function initialize(application) {
  application.inject('route', 'router', 'router:main');
  application.inject('component', 'router', 'router:main');
}

export default {
  name: 'router',
  initialize
};

在initializers / router.js中。如果需要,您也可以注入控制器。然后只需做

this.get('router.currentRouteName');
在JS中

,或

{{router.currentRouteName}}

在模板中。

这是我找到的唯一可靠方法,并且可以在Ember 2.4中观察到

答案 3 :(得分:16)

如果要在组件或控制器中获取当前路由,可以注入路由服务(routing: Ember.inject.service('-routing')

(对于more)并使用:

this.get('routing.currentRouteName')this.get('routing.currentPath')

组件和计算属性的示例:

import Ember from 'ember';

export default Ember.Component.extend({
  routing: Ember.inject.service('-routing'),

  checkMyRouteName: Ember.computed('routing.currentRouteName',  function() {
    return this.get('routing.currentRouteName');
  })
})

控制器和计算属性的示例:

import Ember from 'ember';

export default Ember.Controller.extend({
  routing: Ember.inject.service('-routing'),

  checkMyRouteName: Ember.computed('routing.currentRouteName', function() {
    return this.get('routing.currentRouteName');
  })
})

您需要的路线中的当前路线this.routeName

路线示例

import Ember from 'ember';

export default Ember.Route.extend({
  checkMyRouteName() {
    return this.routeName;
  }
})

答案 4 :(得分:13)

就像更新一样,在Ember 1.8.1中,我们可以通过this.routeName获取Ember.Route对象中的routeName。

答案 5 :(得分:3)

目前,从Ember 1.7.0开始,您可以通过拨打this.routeName从路线中获取当前路线。

答案 6 :(得分:3)

Ember命名空间API现在有一个getOwner方法,这对于查找currentRouteName或其他路由属性非常有用。

  const owner        = Ember.getOwner(this);
  const currentRoute = owner.lookup('router:main').currentRouteName;
  const routeInfo    = owner.lookup(`route:${currentRoute}`).get('info');
  // etc.

我已经创建了一个Ember Twiddle示例来演示。使用"输出"上面的文本输入用于点击其他路线的窗格,例如/blue/green/red

答案 7 :(得分:1)

Ember自2.15开始具有RouterService。它提供当前路由的名称为currentRouteName property。如果您仍使用旧版本,则polyfill适用于Ember 2.4-2.14。

import Component from '@ember/component';

export default Component.extend({
  router: service(),

  isHomeRoute: computed('router.currentRouteName', function() {
    return this.router.currentRouteName === 'home';
  }),
});

这里提到的所有其他解决方案都依赖于私有API,该私有API可能已被弃用/删除。使用RouterService至少可以处理当前版本,在撰写本文时为3.12

请注意,"home"不是/。根URL称为"index"

答案 8 :(得分:0)

我有一段时间遇到同样的问题。然后我开始探索路由器。它总是有一个状态对象,可以使用

从任何路径获得
var route = this;
var handlerInfos = route.get("router.router.state.handlerInfos");
var currRouteHandlerInfo = handlerInfos[handlerInfos.length-1];
var currRouteName = currRouteHandlerInfo.name; //"home"

就是这样。现在你有了当前的路线名称!

如果你想要当前路线参数,

var routerParams = this.get("router.router.state.params");
var currRouteParams = routerParams[currRouteName]; //{ homeId : "1" }

答案 9 :(得分:-2)

您可以简单地解析当前网址。这样您就可以使用完整的URL:

http://127.0.0.1:8000/index.html/#/home

并从该字符串中提取后缀:

/home

这是当前的路线名称。

一个简单的JS函数(无论你的Ember版本如何都有效)将是:

function getCurrentRoute()
{
    var currentRoute;
    var currentUrl = window.location.href; // 'http://127.0.0.1:8000/index.html/#/home'

    var indexOfHash = currentUrl.indexOf('#');
    if ((indexOfHash == -1) ||
        (indexOfHash == currentUrl.length - 1))
    {
        currentRoute = '/';
    }
    else
    {
        currentRoute = currentUrl.slice(indexOfHash + 1); // '/home'
    }

    return currentRoute;
}

使用示例:

if (getCurrentRoute() == '/home')
{
// ...
}