如何在Angular中处理哈希之前和之后的查询字符串

时间:2016-09-01 15:52:12

标签: angularjs query-string

我正在使用Angular v1.4.2

我目前正在处理一个如下所示的查询字符串:

http://localhost/myProject/apply/?A=100&B=ABC&C=Test#/step1?D=3&E=X1&F=1

这意味着在哈希之前声明A,B和C. D,E和F在哈希

之后声明

我无法更改此网址,因为它是由外部API生成的,并且还有一个原因,即网址需要像这样。

我一直试图找到读取所有参数的方法。到目前为止我尝试过的事情:

$location.search();仅返回{D, E, F}

理想情况下,$location.search();应返回{A,B, C, D, E, F}

其中一个解决方案建议更改位置提供程序设置。我的是这些:

function $LocationProvider() {
  var hashPrefix = '',
      html5Mode = {
        enabled: false,
        requireBase: true,
        rewriteLinks: true
      };

将这些设置更改为:

function $LocationProvider() {
  var hashPrefix = '',
      html5Mode = {
        enabled: true,
        requireBase: false,
        rewriteLinks: false
      };

没有修复任何东西,无论如何,对于这个尺寸的项目,我不想弄乱这些设置。

有没有办法读取所有查询字符串参数?

1 个答案:

答案 0 :(得分:0)

我最终得到了这个。如果有更好的方法,我想知道

创建一个工厂,读取左侧的所有参数。 此时,无法读取右侧的参数。

   export class QueryStringFactory {

        static $inject = ["$window", "$location"];

        private window: ng.IWindowService;
        private location: angular.ILocationService;

        constructor(public $window: ng.IWindowService, public $location: angular.ILocationService) {
            this.window = $window;
            this.location = $location;
        }

        searchLeft() {
            var left = window.location.search
                .split(/[&||?]/)
                .filter((x) => { return x.indexOf("=") > -1; })
                .map((x) => { return x.split(/=/); })
                .map((x) => {
                    x[1] = x[1].replace(/\+/g, " ");
                    return x;
                })
                .reduce((acc, current) => {
                    acc[current[0]] = current[1];
                    return acc;
                }, {});
            return left;
        }

        static factory() {
            var instance = ($window: ng.IWindowService, $location: angular.ILocationService) =>
                new QueryStringFactory($window, $location);
            return instance;
        }
    }

注册工厂:

angular.factory("QueryStringFactory", Utils.QueryStringFactory.factory());

并在控制器中使用它:

    constructor(public $window: angular.IWindowService | any,
        public $location: angular.ILocationService, public queryString: Utils.QueryStringFactory) {

        var qsParamsRight = $location.search();
        var qsParamsLeft = queryString.searchLeft();
        var qsAllParams = $.extend(true, {}, qsParamsLeft, qsParamsRight);
    });