我采用了一种新方法,您可以在其中侦听$routeChangeStart 并修改search(),如果之前的(不存在的)页面包含重要 GET 参数。完整的源代码和演示可以在 this Plunker 上找到。
概念类似于@Mikko 的解决方案,但实现有点不同(没有自定义提供程序),它按照作者的说明工作。
本质
angular.module('myApp').run(['$rootScope', '$location', 'URL', function($rootScope, $location, URL) {
// Previous search() value
var prevSearch = {};
// Listen to event
$rootScope.$on('$routeChangeStart', function(evt, next, current) {
// Have search() parameters and are going to default route
if(prevSearch !== undefined && $location.path().endsWith(URL.defaultRoute)) {
// Extract only important params
var important = {};
var importantCount = 0;
for(var param in prevSearch) {
if(URL.importantParams.indexOf(param) > -1) {
important[param] = prevSearch[param];
importantCount++;
}
}
// Unset prevSearch
prevSearch = {};
// Apply important params, if any
if(importantCount > 0) {
$location.search(important);
}
} else {
// Remember current search()
prevSearch = $location.search();
}
});
}]);
run 函数为$routeChangeStart 设置了一个侦听器,并且还记住了search() 值的先前值(GET 参数)。
当应用程序被重定向到默认路由时,它会检查 search() 参数的先前值并仅提取重要的参数。如果有的话,它会覆盖 search() 值,因此将重要的 GET 参数设置为默认路由。
我制作了一个URL 常量,可以在其中设置默认路由并指定重要参数。代码如下:
angular.module('myApp').constant('URL', {
defaultRoute: '/mainpage',
importantParams: ['a', 'b'],
});
演示
first 链接在一个不存在的 URL 上包含 3 个参数。页面被正确重定向到默认路由,并且只保留了 2 个重要的。
second 和 fourth 链接不包含任何参数,并且两个链接都不应用任何附加参数(无论您在哪个页面上单击它们) .
第三个链接还包含默认路由上的 3 个参数,所有参数都被保留(不发生重定向)。