在Ember获取当前路线名称

问题描述 投票:13回答:9

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

this.transitionTo(userLang);

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

if (currentRoute == 'home'){
  this.transitionTo(userLang)
}
ember.js
9个回答
17
投票

您可以观察applicationcurrentPath并在其发生变化时将其设置为当前路线:

App = Ember.Application.create({
  currentPath: '',
});

App.ApplicationController = Ember.Controller.extend({
  updateCurrentPath: function() {
    App.set('currentPath', this.get('currentPath'));
  }.observes('currentPath')
}),

这样你就可以随时使用qazxsw poi访问qazxsw poi

EG

currentPath

希望能帮助到你。


-2
投票

您可以简单地解析当前URL。这样您可以使用完整的URL作为示例:

/

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

"index"

这是当前的路线名称。

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

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

使用示例:

/home

25
投票

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

App.get('currentPath');

请注意,文档说明:

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

但是,我认为强烈建议不要在生产代码中使用if (App.get('currentPath') == 'home'){ this.transitionTo(userLang); } 。更可接受的替代方案是使用App.__container__.lookup('router:main').location.lastSetURL ,它提供有关当前Ember路线的信息。

另一种选择是App.__container__上的App.Router.router.currentHandlerInfos。您可以将currentRouteName添加到控制器,然后使用ApplicationController访问路径名称。这将返回类似needs: ['application']的东西。


18
投票

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

controllers.application.currentRouteName

(来自命令行),和

posts.index

在initializers / router.js中。如果需要,您也可以注入控制器。那就干脆做吧

ember g initializer router

在JS,或

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

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

在模板中。

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


16
投票

如果要在组件或控制器中获取当前路由,可以注入路由服务(this.get('router.currentRouteName');

(对于{{router.currentRouteName}} )并使用:

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

13
投票

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


3
投票

目前,从Ember 1.7.0开始,您可以通过致电import Ember from 'ember'; export default Ember.Route.extend({ checkMyRouteName() { return this.routeName; } }) 获取当前路线。


3
投票

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

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


0
投票

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

/green

而已。现在你有了当前的路线名称!

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

/red

0
投票

自从2.15开始,恩伯有一个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" } 。如果你仍然使用这样一个旧版本,则存在适用于Ember 2.4 - 2.14的RouterService

currentRouteName property

此处提到的所有其他解决方案都依赖于可能已被弃用/删除的私有API。使用polyfill至少在当前版本上工作,在写这篇文章的时候是import Component from '@ember/component'; export default Component.extend({ router: service(), isHomeRoute: computed('router.currentRouteName', function() { return this.router.currentRouteName === 'home'; }), });

请注意,RouterService不是3.12。根URL称为"home"

© www.soinside.com 2019 - 2024. All rights reserved.