Ember-获取转换的目标url

Ember - get target url of transition

本文关键字:目标 url 转换 获取 Ember-      更新时间:2023-09-26

如果不允许您查看某些内容(换句话说,如果服务器返回401),我将在Ember.js应用程序中创建一个错误挂钩,将您重定向到身份验证服务。

它看起来像这样:

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

我也遇到了对此的需求,并使用了一些内部API。在我的情况下,我想重新加载整个应用程序,这样,如果你切换用户,就不会有其他用户留下的数据。当我重新加载应用程序时,我想把用户放在他们试图转换到的URL上,但他们没有足够的权限。在他们进行身份验证(从而在本地存储中拥有承载令牌)之后,我想使用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使用),并且恰好将路由器作为属性。

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

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

花了几个小时寻找这个问题的答案,并使用Chrome调试器尝试对Ember 2.5代码进行反向工程,我的结论是,目前您所寻找的是不可能的。

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

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

Kevins的答案是最正确的,我得出了类似的解决方案。基本上,我发现了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);