更改视图时,用AngularJS保存查询参数的最简单方法是什么?
在视图和视图之间链接时,是否有一种简单的方法来保持查询参数 使用ngHref时,查询参数丢失:更改视图时,用AngularJS保存查询参数的最简单方法是什么?,angularjs,Angularjs,在视图和视图之间链接时,是否有一种简单的方法来保持查询参数 使用ngHref时,查询参数丢失: <a ng-href='OtherPage'>Other page</a> 有没有更具声明性的方法呢?这两种方法略有不同。我认为您正在寻找的代码是: <a ng-href='#/OtherPage'>Other page</a> 然后,当您在应用程序中导航时,查询字符串将不会被替换。我当前将$location服务附加到范围中,并使用ng click进
<a ng-href='OtherPage'>Other page</a>
有没有更具声明性的方法呢?这两种方法略有不同。我认为您正在寻找的代码是:
<a ng-href='#/OtherPage'>Other page</a>
然后,当您在应用程序中导航时,查询字符串将不会被替换。我当前将
$location
服务附加到范围中,并使用ng click进行导航,例如ng click=“$location.path('/target')”
任何查询参数都不会被替换。我也面临类似的问题。我必须在多个视图中维护查询字符串。而且,在维护querystring时,我还必须检查$$hash。在我的例子中,我应该只在portfolio视图中移动$$hash值。我希望这有帮助
var onRouteChangeOff = $scope.$on('$locationChangeStart', routeChange);
function routeChange(event, newUrl, oldUrl) {
onRouteChangeOff();
if (oldUrl.indexOf('?') >= 0) {
var queryString = oldUrl.split('?')[1];
queryString = queryString.split('#')[0];
newUrl = $location.$$path + '?' + queryString;
if($location.$$path === '/portfolio')
{
newUrl += '#' + $location.$$hash
}
$location.url(newUrl);
}
event.preventDefault();
return;
}
如果您只希望在没有任何$$hash值的视图之间维护querystring,那么下面的代码就可以了
var onRouteChangeOff = $scope.$on('$locationChangeStart', routeChange);
function routeChange(event, newUrl, oldUrl) {
onRouteChangeOff();
if (oldUrl.indexOf('?') >= 0) {
var queryString = oldUrl.split('?')[1];
newUrl = $location.$$path + '?' + queryString;
$location.url(newUrl);
}
event.preventDefault();
return;
}
下面是TypeScript中的一些示例代码,Angular 1。 它解析旧的查询参数并将它们合并到新的查询参数中。 (根据Pankaj的回答。)
谢谢,但这也不行。我也试过“其他页面”。我在问题中添加了url的示例。。。是的,请给出一个你拥有的url的例子,谢谢,这解决了重定向问题。但它引入了第二个问题:Angular不再识别查询字符串:$location.search('stat')==undefined。另一方面,$window.location.search以文本形式返回查询字符串。使用sugarjs,我可以简单地编写Object.fromQueryString($window.location.search).stat来获取查询参数。它只识别散列标记,而您恰好将stat放在散列标记后面。URL总是用URL?QUERY#u STRING#HASH#Tag构建的(即使没有角度),我知道这不是最漂亮的方法,我现在会做不同的事情。但这是可行的,那么,漂亮还是不漂亮是否决投票的理由呢?
var onRouteChangeOff = $scope.$on('$locationChangeStart', routeChange);
function routeChange(event, newUrl, oldUrl) {
onRouteChangeOff();
if (oldUrl.indexOf('?') >= 0) {
var queryString = oldUrl.split('?')[1];
queryString = queryString.split('#')[0];
newUrl = $location.$$path + '?' + queryString;
if($location.$$path === '/portfolio')
{
newUrl += '#' + $location.$$hash
}
$location.url(newUrl);
}
event.preventDefault();
return;
}
var onRouteChangeOff = $scope.$on('$locationChangeStart', routeChange);
function routeChange(event, newUrl, oldUrl) {
onRouteChangeOff();
if (oldUrl.indexOf('?') >= 0) {
var queryString = oldUrl.split('?')[1];
newUrl = $location.$$path + '?' + queryString;
$location.url(newUrl);
}
event.preventDefault();
return;
}
$rootScope.$on('$locationChangeStart', (event:IAngularEvent, newUrl:string, oldUrl:string) => {
let oldPath = oldUrl.replace(/^([^?#])+/, '$1');
if (oldUrl.indexOf('?') >= 0 && oldPath !== $location.path()) {
let queryString = oldUrl.split('?')[1];
if (queryString.indexOf('#') >= 0) {
queryString = queryString.split('#')[0];
}
let oldParamStrings:string[] = queryString.split('&');
let oldParams:{[key:string]:string} = {};
oldParamStrings.forEach((oldParamString:string) => {
let keyValue:string[] = oldParamString.split('=');
oldParams[decodeURIComponent(keyValue[0])] = decodeURIComponent(keyValue[1]);
});
let newParams = $location.search();
if (!angular.equals(newParams, oldParams)) {
angular.merge(newParams, oldParams);
$location.search(newParams);
return;
}
}
// ANY OTHER CODE
//////
});