我有一个对象,我试图通过网址传递 - 比如
$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);
我如何使用这样的东西,(如果网址现在很大,那就好了,但如果有办法缩小它 - 甚至更好!)
谢谢!
答案 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();