我需要在我的ember应用程序中获取当前路由名称;我试过这个: Ember App.Router.router.currentState undefined 但它对我不起作用(有可能是我想念的东西......)我使用Ember rc6并且我有一个多语言应用程序;在applicationRoute中,我检测到浏览器的语言,然后使用以下命令重定向到正确的页面:
this.transitionTo(userLang);
但我希望只有当用户在主页上时才能执行此操作,所以这样:
if (currentRoute == 'home'){
this.transitionTo(userLang)
}
答案 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')
{
// ...
}