Ember - get target url of transition

时间:2015-06-30 14:00:34

标签: javascript url redirect ember.js

I am creating an error hook in my Ember.js app to redirect you to the auth service if you are not allowed to view certain content (in other words, if the server returns a 401).

It looks like this:

Ember.Route = Ember.Route.extend({
  error: function(error, transition){
    if (error.status === 401) {
      window.location.replace("https://auth.censored.co.za");
    }
  }

Our auth api works as follows: If you send it a parameter called target (which is a url), it will redirect you back to that target url after you've logged in.

So I want to somehow get the URL of the route the Ember app was trying to transition to.

Then my code will end up something like this

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

4 个答案:

答案 0 :(得分:4)

我也遇到了这种需求,并使用了一些内部API。在我的情况下,我想重新加载整个应用程序,以便如果您切换用户,则不会有来自其他用户的数据。当我重新加载应用程序时,我想将用户放在他们尝试转换到的URL上,但是他们没有足够的权限。在他们进行身份验证(因此在localstorage中具有持有者令牌)之后,我想使用window.location.replace(url)来获取整个应用程序的干净副本,其中用户位于Ember Transition对象隐含的URL处。但问题是,如何从Transition对象转到URL?这是我的解决方案,它使用generate方法,它是路由器的私有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(由link-to使用),并且恰好将路由器作为属性。

虽然很乱,但也许你会觉得这很有帮助。

答案 1 :(得分:1)

在花了几个小时寻找这个问题的答案并使用Chrome调试器尝试对Ember 2.5代码进行反向工程之后,我的结论是,您目前无法查找所需的内容。

对于不理解为什么有人想要这样做的人,当身份验证(例如登录页面)与应用程序分离时就会出现这种情况。如果要求用户未经过身份验证,则要求不向用户提供任何内容(包括应用程序本身),这是必要的。换句话说,登录页面不能是应用程序的一部分,因为在登录之前不允许用户访问该应用程序。

PS:我意识到这不是用户问题的解决方案,可能更适合作为评论。但是,我无法发表评论。

答案 2 :(得分:1)

凯文斯的答案是最正确的答案,我来到了一个类似的解决方案。基本上我发现link-to组件如何填充href属性并使用相同类型的代码。

在您的对象中注入-routing。我是这样做的:

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

答案 3 :(得分:1)

我能够使用transition.intent.url来完成这一点。我不确定这是私密的还是不相关的讨论:https://discuss.emberjs.com/t/getting-url-from-ember-router-transition-for-sso-login/7079/2