来自url的角度,编码和解码对象

时间:2015-03-05 17:13:22

标签: javascript angularjs

我有一个对象,我试图通过网址传递 - 比如

$location.search(myObject) 

然而,当这个对象成为一个对象数组时,我遇到了问题。我想知道如何放置一个大型物体(现在它是一系列物体,我不知道是否需要改变),然后将其拉回控制器用

 $location.search()

如果我的对象只是一个小对象,那么它可以正常工作,现在它的内部级别就是一个对象数组

 var testIt = [{
                    "module1" : 
                    [
                        { 
                            "name1"  : ["option1", "option2", "option3"]
                        },
                        { 
                            "name2"  : ["option1", "option2", "option3"]
                        }
                    ]
                },
                {
                    "module2" : 
                    [
                        { 
                            "name3"  : ["option1", "option2", "option3"]
                        },
                        { 
                            "name4"  : ["option1", "option2", "option3"]
                        }
                    ]
                }];

            $location.search(testIt);

我如何使用这样的东西,(如果网址现在很大,那就好了,但如果有办法缩小它 - 甚至更好!)

谢谢!

1 个答案:

答案 0 :(得分:4)

我会提供服务来将对象编码/解码为URL编码的JSON字符串:

angular.module('app', [])
.factory('StateString', function() {
  return {
    encode: function(data) {
      return encodeURIComponent(JSON.stringify(data));
    },
    decode: function(searchString) {
      return JSON.parse(decodeURIComponent(searchString));
    }
  };
});

然后你可以将这个JSON字符串放在URL上的查询参数上(确保注入我们刚刚定义的StateString服务:

var data = [
  {
    module1: {
      name1: ["option1", "option2"]
    }
  }, {
    module2: {
      name2: ["option2", "option2"]
    }
  }
];

$location.search({
  state: StateString.encode(data)
});

然后像这样取回来:

var state = StateString.decode($location.search().state);

您的网址会很长,我给出的示例会生成一个查询字符串:

"%5B%7B%22module1%22%3A%7B%22name1%22%3A%5B%22optio…22%3A%5B%22option2%22%2C%22option2%22%5D%7D%7D%5D"

我确信有人会对如何压缩它有一些好主意......

修改

如果您愿意,可以将$location.search()部分包含在您的服务中:

angular.module('app', [])
.factory('LocationSearchState', function() {
  return {

    set: function(data) {
      $location.search(
        { state: encodeURIComponent(JSON.stringify(data)) }
      );
    },

    get: function(searchString) {
      return JSON.parse(
        decodeURIComponent($location.search().state)
      );
    }

  };
});

所以在你的控制器(或任何地方),你可以使用:

var state = [{ ... }];
LocationSearchState.set(state);

var state = LocationSearchState.get();