【问题标题】:angularjs - Unable to change URL on button's clickangularjs - 单击按钮时无法更改 URL
【发布时间】:2019-09-02 19:44:33
【问题描述】:

我想在单击按钮并执行一些代码时添加一个额外的查询参数。当作为右键单击菜单的一部分执行时,完全相同的代码对我来说效果很好。但是当我尝试使用按钮单击来执行此操作时,它不起作用(例如,我可以看到 URL 已更改,但在所有 angularjs 内部代码运行后,它会返回到以前的值,并且未附加我的额外搜索参数)。

这是我正在尝试的代码(我尝试添加最后一行,但没有改变结果):

addParameterToUrl(paramName, value) {
    const urlParams = new URLSearchParams(window.location.search);

    urlParams.set(paramName, value);
    const newQuery = `${window.location.pathname}?${urlParams.toString()}`;

    history.pushState(null, "", newQuery);

   SW.serviceLoader.Location.path(newQuery, false);
}

有什么方法可以通过点击按钮(输入类型=“按钮”)来更改网址?


在阅读了几个线程和文档并尝试了许多不同的方法后,我终于明白了:

.finally(() => {
    Spinner.stopSpinner("updateBooking");
    this.onReload();
    Timeout(() => {
        this.beforeUnload();
     }, 0);
 });

【问题讨论】:

  • 很难说,因为答案不准确。如果您使用按钮,但它都是相同的处理程序方法,这无关紧要。快速测试和默认代码:$location.path('/newValue').search({key: value}); 与按钮一起使用时效果很好。
  • 您是否看到我的代码可能有什么问题或应该如何更改?我在控制台中添加了 window.location.href ,我看到在我的方法运行后添加了我的参数,但随后它正在执行一些标准的 angularjs 代码,并且在其中一个 return resolver(value);我看到它恢复了。
  • 我会在一秒钟内尝试使用超时。在看到您的答案之前,我对 $scope.$apply() 有了一个想法,但是关于摘要的错误已经在进行中。
  • 我想我已经尝试了一切,但我无法让它工作:(我最后一次尝试是 Timeout(() => { this.scope.$apply(()=> { this .beforeUnload(); }); }, 2000); }

标签: javascript angularjs


【解决方案1】:

在将这段代码(基于我在上一条评论中提到的线程)添加到 app.js 之后,我的代码现在可以再次运行:

app.config(["$provide", $provide => {
        $provide.decorator("$browser", ["$delegate", $delegate => {
            $delegate.onUrlChange = () => { };
            $delegate.url = () => "";

            return $delegate;
        }]);
    }]);

我如何仔细检查这是否引入了任何问题?

【讨论】:

  • 我开始测试并发现我现在遇到了一个新问题 - 如果我尝试直接访问 appAddress/PrivateInstruction/Instructors#/edit/KNHE6V2CJ5AVERBR 之类的页面,则无法打开编辑表单。那么,有没有办法只在特定位置添加此配置更改,然后重新设置?
【解决方案2】:

我已将此代码添加到主 app.js 并且确实有效:

app.config(["$provide", function ($provide) {
        $provide.decorator("$browser", ["$delegate", "$window",
            function ($delegate, $window) {
            // normal anchors
            const ignoredPattern = /^#[a-zA-Z0-9].*/;
            const originalOnUrlChange = $delegate.onUrlChange;
            $delegate.onUrlChange = function (newUrl, newState) {
                if (ignoredPattern.test($window.location.hash)) return;
                if ($window.location.href.indexOf("stolenids") >= 0) return;
                originalOnUrlChange.apply($delegate, arguments);
            };
            const originalUrl = $delegate.url;
            $delegate.url = function (url, replace, state) {
                if (ignoredPattern.test($window.location.hash)) return $window.location.href;
                if ($window.location.href.indexOf("stolenids") >= 0) return $window.location.href;
                return originalUrl.apply($delegate, arguments);
            };
            return $delegate;
        }]);
    }]);

我不太喜欢它,因为它使用了我需要添加到我的网址中的特定字符串。我宁愿以某种方式直接在页面的控制器中修复该行为,但我不确定如何并且我已经尝试了很多东西。你觉得这个解决方案好吗?

【讨论】:

    猜你喜欢
    • 2015-05-09
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 2014-01-10
    • 2016-08-03
    • 1970-01-01
    相关资源
    最近更新 更多