Javascript 余烬-获取转换的目标url
我正在我的Ember.js应用程序中创建一个错误挂钩,如果不允许您查看某些内容(换句话说,如果服务器返回401),则将您重定向到身份验证服务 看起来是这样的:Javascript 余烬-获取转换的目标url,javascript,url,redirect,ember.js,Javascript,Url,Redirect,Ember.js,我正在我的Ember.js应用程序中创建一个错误挂钩,如果不允许您查看某些内容(换句话说,如果服务器返回401),则将您重定向到身份验证服务 看起来是这样的: Ember.Route = Ember.Route.extend({ error: function(error, transition){ if (error.status === 401) { window.location.replace("https://auth.censored.co.za");
Ember.Route = Ember.Route.extend({
error: function(error, transition){
if (error.status === 401) {
window.location.replace("https://auth.censored.co.za");
}
}
我们的auth api的工作原理如下:如果您向它发送一个名为target
(这是一个url)的参数,它将在您登录后将您重定向回该目标url
所以我想以某种方式获取Ember应用程序试图转换到的路线的URL
然后我的代码会变成这样
Ember.Route = Ember.Route.extend({
error: function(error, transition){
if (error.status === 401) {
var target = // Your answer here
window.location.replace("https://auth.censored.co.za?target=" + encodeURIComponent(target));
}
}
在花了几个小时寻找这个问题的答案,并使用Chrome调试器尝试对Ember 2.5代码进行反向工程之后,我的结论是,目前您所寻找的是不可能的 对于不理解为什么有人要这样做的人,当身份验证(例如登录页面)与应用程序分离时,就会出现这种情况。如果要求在用户未经身份验证的情况下不向用户交付任何内容(包括应用程序本身),则这是必要的。换句话说,登录页面不能是应用程序的一部分,因为用户在登录之前不允许访问应用程序
PS:我意识到这不是用户问题的解决方案,可能更适合作为评论。但是,我不能发表评论。我也遇到了这样的需求,并求助于使用一些内部API。在我的例子中,我想重新加载整个应用程序,这样,如果你正在切换用户,就不会有其他用户留下的数据。当我重新加载应用程序时,我想将用户放在他们试图转换到的URL上,但他们没有足够的权限。在他们进行身份验证(从而在localstorage中拥有承载令牌)之后,我想使用
window.location.replace(url)
,在EmberTransition
对象所暗示的url处与用户一起获得整个应用程序的干净副本。但问题是,如何从对象转换为URL?这是我的解决方案,它使用生成
方法,这是路由器的专用API:
let paramsCount = 0;
let params = {};
let args = [transition.targetName];
// Iterate over route segments
for (let key1 in transition.params) {
if (transition.params.hasOwnProperty(key1)) {
let segment = transition.params[key1];
// Iterate over the params for the route segment.
for (let key2 in segment) {
if (segment.hasOwnProperty(key2)) {
if (segment[key2] != null) {
params[key2] = segment[key2];
paramsCount++;
}
}
}
}
}
if (paramsCount > 0) {
args.push(params);
}
let url = router.generate.apply(router, args);
您需要通过容器查找或其他方式获取路由器。我通过注入-routing
服务获得了它,该服务被记录为一个API,将来可能会公开(由链接到使用),并且碰巧将路由器作为一个属性
虽然有些混乱,但也许你会觉得这很有帮助。Kevins的答案是最正确的,我找到了一个类似的解决方案。基本上,我发现了链接到
组件是如何填充href
属性的,并使用了相同类型的代码
在对象中注入-路由
。我是这样做的:
'routing': Ember.inject.service('-routing'),
然后从转换生成URL的代码如下所示
let routing = this.get('routing');
let params = Object.values(transition.params).filter(param => {
return Object.values(param).length;
});
let url = routing.generateURL(transition.targetName, params, transition.queryParams);
我能够使用transition.intent.url
来实现这一点。我不确定这是否是私人的——相关的讨论:。“没有解决方案”也是一个有效的答案——感谢您的反馈