AngularJS: 如何清除 URL 中的查询参数?

我的 AngularJS 应用程序需要访问用户的 LinkedIn 配置文件。为了做到这一点,我需要重定向用户到一个 LinkedIn URL,其中包含一个回调 redirect _ uri 参数,它将告诉 LinkedIn 重定向用户回到我的网络应用程序,并在 URL 中包含一个“代码”查询参数。这是传统的 Oauth 2.0流程。

除了 LinkedIn 将用户重定向回下面的 URL 之外,一切都很好:

http://localhost:8080/?code=XXX&state=YYY#/users/123/providers/LinkedIn/social-sites

我想删除 ?code=XXX&state=YYY从网址,以便使它干净。用户不需要查看我从 LinkedIn 重定向收到的查询参数。

我试过 $location.absUrl($location.path() + $location.hash()).replace(),但是它把查询参数保留在 URL 中。

我也无法提取查询参数,例如“代码”,使用 ($location.search()).code。 似乎在上面的 URL 中使用? before # 是在欺骗 Angular。

127087 次浏览

我最终从 AngularJS 论坛得到了答案。详情请参阅 这根线


这个链接是一个谷歌群组的线程,很难阅读,也没有提供一个明确的答案。要删除 URL 参数,请使用

$location.url($location.path());

您可以使用以下方法删除特定的查询参数:

delete $location.$$search.nameOfParameter;

或者您可以通过将 search 设置为空对象来清除所有查询参数:

$location.$$search = {};

要清除一个项目,请删除它并调用 $$compose

    if ($location.$$search.yourKey) {
delete $location.$$search.yourKey;
$location.$$compose();
}

来源: https://github.com/angular/angular.js/blob/c77b2bcca36cf199478b8fb651972a1f650f646b/src/ng/location.js#L419-L443

html5mode = false时需要使它工作吗?

所有其他的答案工作时,角度的 html5modetrue。如果您在 html5mode之外工作,那么 $location只引用存在于散列中的“假”位置——因此 $location.search无法查看/编辑/修复实际页面的搜索参数。

这里有一个变通方法,可以插入到 之前页面的 HTML 中:

<script>
if (window.location.search.match("code=")){
var newHash = "/after-auth" + window.location.search;
if (window.history.replaceState){
window.history.replaceState( {}, "", window.location.toString().replace(window.location.search, ""));
}
window.location.hash = newHash;
}
</script>

我吸毒

$location.search('key', null)

因为这不仅会删除我的键,而且会从 URL 的可见性中删除它。

在撰写本文时,正如@Bosh 之前提到的,html5mode必须是 true,以便能够设置 $location.search()并将其反射回窗口的可视 URL。

有关更多信息,请参见 https://github.com/angular/angular.js/issues/1521

但是 如果 html5mode true你可以很容易地清除 URL 的查询字符串:

$location.search('');

或者

$location.search({});

这也会改变窗口的可视化 URL。

(使用 AngularJS 版本 1.3.0-rc.1html5Mode(true)进行测试。)

如果使用路由参数,只需清除 $routeParams

$routeParams= null;

将位置散列设置为 null 怎么样

$location.hash(null);

如果您立即处理参数,然后移动到下一个页面,您可以在新位置的末尾添加问号。

例如,如果你 路径(’/nextPage’) ;

你可以这样做: $location.path (’/nextPage?’) ;

用就是了

$location.url();

而不是

$location.path();

要删除 全部查询参数,请执行:

$location.search({});

要删除 特定查询参数,请执行:

$location.search('myQueryParam', null);

我已经试过以上的答案,但不能让他们的工作。我唯一能用的代码就是 $window.location.search = ''

我可以用这一行代替所有查询参数: $location.search({});
很容易理解,也很容易清除它们。

接受的答案对我有用,但是我需要更深入一点来解决返回按钮的问题。

我注意到,如果我使用 <a ui-sref="page({x: 1})">链接到一个页面,然后使用 $location.search('x', null)删除查询字符串,我不会在浏览器历史中得到额外的条目,所以后退按钮会带我回到我开始的地方。虽然我觉得这是错误的,因为我不认为 Angular 应该为我自动删除这个历史条目,但这实际上是我特定用例所期望的行为。

问题是,如果我使用 <a href="/page/?x=1">链接到页面,然后以同样的方式删除查询字符串,我 在我的浏览器历史中得到一个额外的条目,所以我必须单击返回按钮 两次返回到我开始的地方。这是不一致的行为,但实际上这似乎更正确。

我可以很容易地解决的问题与 href链接使用 $location.search('x', null).replace(),但这打破了页面时,你降落在它通过 ui-sref链接,所以这是没有好处的。

经过一番折腾,我想出了一个解决办法:

在我的应用程序的 run功能中,我添加了以下内容:

$rootScope.$on('$locationChangeSuccess', function () {
$rootScope.locationPath = $location.path();
});

然后我使用这段代码来删除查询字符串参数:

$location.search('x', null);


if ($location.path() === $rootScope.locationPath) {
$location.replace();
}

如果您想移动到另一个 URL 并清除查询参数,只需使用:

$location.path('/my/path').search({});