【问题标题】:History push state redirects instead of just pushing new state to browser history历史推送状态重定向,而不是仅仅将新状态推送到浏览器历史
【发布时间】:2019-04-11 04:49:22
【问题描述】:

我正在尝试在我的 APP 初始化时将新状态推送到浏览器历史记录,但在推送状态时它还会重定向不需要的页面。

这是一个演示工作应用程序。 https://angular-tet5fy.stackblitz.io/page2?fbclid=IwAR1zP_UTnCQxKMp8o3ZXf-n4NR3ftu_4JoulLqItaONa-_wSPJ_DT95OgRU

这是代码:

ngAfterViewInit() {
    console.log('init called');
    var x = document.referrer;
    console.log('ref', x);

    if (x) {
      console.log('pushing state');
      this.location.pushState({id:'page3'}, 'Page3', '/page3');
    }
}

预期行为:

  1. 点击链接会将用户带到第 2 页。
  2. 当 page2 初始化时,它应该将状态“/page3”推送到浏览器历史记录。
  3. 当用户现在点击浏览器返回时,它应该转到 /page3,因为它已在上面的步骤 2 中被推送到历史记录。

当前行为:

  1. 单击链接,将我带到 page2,但在推送状态时它会自动重定向到 /page3。
  2. 当点击浏览器返回时,它带我回到 /page2。

【问题讨论】:

    标签: javascript angular html angular-routing browser-history


    【解决方案1】:
    ngAfterViewInit() {
        console.log('init called');
        var x = document.referrer;
        console.log('ref', x);
    
        if (x) {
          console.log('pushing state');
          let locat = location.href;
          history.replaceState({id:'page3'},'Page3','/page3');
          history.pushState(null,null,locat);
        }
    }
    

    我们在这里所做的是将 url 更改为 你想成为后面的 urlhistory.replaceState({id:'page3'},'Page3','/page3'); 然后在历史记录中使用 history.pushState(null, null,locat); 与他的第一个 url 创建一个新条目。

    我已经在两个不同的帖子中回答了你这个问题,只是略有不同:

    Angular platformLocation pushState not working

    Angular: take user to home on clicking browser back button

    fork 实例: https://angular-stack-55624908.stackblitz.io/page2

    【讨论】:

    • 是的,您回答了,但您正在检查状态是否为空,然后通过路由器服务重定向。但这看起来是一种解决方法,而不是一个合适的解决方案,因为当我们使用 history.pushState 推送状态时,浏览器本身应该负责导航
    • 另外,我很高兴您之前的解决方案确实有效,因此我投了赞成票,但这个问题陈述只是更大问题陈述的一小部分,因此我正在寻找浏览器历史记录以照顾导航.
    • 您看到解决方案了吗?它涵盖了问题。我不明白现在到底是什么问题。你能解释得更深入一点吗?因为使用该代码它应该可以工作。在另一个说明中,您没有在其他两个帖子中对其进行投票或将其标记为正确答案。
    【解决方案2】:

    预期行为: 1. 单击链接将用户带到第 2 页。 2. 当 page2 初始化时,它应该将状态 '/page3' 推送到浏览器历史记录。 3. 当用户现在点击浏览器时,它应该转到/page3,因为它在上面的步骤2中被推送到历史记录。

    因为你做了什么,你的历史状态变成:p1 -> p2 -> p3。就是你的描述!你想要这样:

    1. 点击链接第一次推送状态p3
    2. 然后带用户到p2,初始化时不要push state
    3. 浏览器现在按预期工作

    编辑:

    这就是您可以实现它的方式。在page2.component.ts.

    ngOnInit() {
      history.replaceState({ data: 'at page 3' }, 'Page3', '/page3');
      history.pushState({ data: 'at page 2' }, 'Page2', '/page2');
    }
    

    不过,请再次阅读doc

    【讨论】:

    • 是的,你说得对。我想在用户登陆到 page2 之前推送一个状态“/page3”,所以当用户点击返回时,他会被带到 page3。
    • @VarunSukheja 啊,所以你知道我提出的正确步骤,但你不知道如何实施它们,对吧?
    • @VarunSukheja 首先仔细阅读doc,就您的尝试提供反馈。
    • 在这里查看代码stackblitz.com/edit/angular-wb9fnf?file=src/app/…。我只是在我的应用程序初始化时推送一个 url,但它重定向到 page3。要查看实际代码,请单击angular-wb9fnf.stackblitz.io/page2
    猜你喜欢
    • 2013-10-01
    • 2012-07-27
    • 2012-05-18
    • 1970-01-01
    • 2012-10-13
    • 2017-06-26
    • 1970-01-01
    • 2020-03-07
    • 2018-06-07
    相关资源
    最近更新 更多