更改视图时,用AngularJS保存查询参数的最简单方法是什么?

更改视图时,用AngularJS保存查询参数的最简单方法是什么?,angularjs,Angularjs,在视图和视图之间链接时,是否有一种简单的方法来保持查询参数 使用ngHref时,查询参数丢失: <a ng-href='OtherPage'>Other page</a> 有没有更具声明性的方法呢?这两种方法略有不同。我认为您正在寻找的代码是: <a ng-href='#/OtherPage'>Other page</a> 然后,当您在应用程序中导航时,查询字符串将不会被替换。我当前将$location服务附加到范围中,并使用ng click进

在视图和视图之间链接时,是否有一种简单的方法来保持查询参数

使用ngHref时,查询参数丢失:

<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
    //////
  });