【问题标题】:Ember - get target url of transitionEmber - 获取转换的目标 url
【发布时间】:2015-09-17 09:01:24
【问题描述】:

如果您不允许查看某些内容(换句话说,如果服务器返回 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));
    }
  }

【问题讨论】:

    标签: javascript url redirect ember.js


    【解决方案1】:

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

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

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

    【讨论】:

    • “没有解决方案”也是一个有效的答案 - 感谢您的反馈
    【解决方案2】:

    我也遇到了这种需求,于是求助于使用一些内部 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 使用),并且恰好将路由器作为属性。

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

    【讨论】:

      【解决方案3】:

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

      在你的对象中注入-routing。我这样做了:

      'routing': Ember.inject.service('-routing'),
      

      那么从transition生成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);
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-12-05
          • 1970-01-01
          • 2016-08-15
          • 2014-04-24
          • 2014-12-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-08
          相关资源
          最近更新 更多