Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.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 余烬-获取转换的目标url_Javascript_Url_Redirect_Ember.js - Fatal编程技术网

Javascript 余烬-获取转换的目标url

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.js应用程序中创建一个错误挂钩,如果不允许您查看某些内容(换句话说,如果服务器返回401),则将您重定向到身份验证服务

看起来是这样的:

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)
,在Ember
Transition
对象所暗示的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
来实现这一点。我不确定这是否是私人的——相关的讨论:。

“没有解决方案”也是一个有效的答案——感谢您的反馈