我遇到了Angular2处理url编码JSON矩阵参数的问题。我需要创建一个自定义UrlSerializer来处理JSON中字符串字段内的括号。例如:用户代理字符串。自定义序列化的样子:Angular2 Url编码JSON矩阵参数
import { Injectable } from '@angular/core';
import { DefaultUrlSerializer, UrlSerializer, UrlTree } from '@angular/router';
@Injectable()
export class CustomUrlSerializer implements UrlSerializer {
constructor(
private defaultUrlSerializer: DefaultUrlSerializer
) {}
parse(url: string): UrlTree {
const defaultTree = this.defaultUrlSerializer.parse(url);
return defaultTree;
}
serialize(tree: UrlTree): string {
// Use the default serializer to create a url.
const defaultSerialization = this.defaultUrlSerializer.serialize(tree);
const parenthesisFix = defaultSerialization
.replace(/\(/g, '%28')
.replace(/\)/g, '%29');
return parenthesisFix;
}
}
正如你所看到的,括号正在除了标准序列,默认情况下假定括号是特殊字符序列。 该代码对于简单值正确工作。这里,两个矩阵参数('comp_id'和'camp_id')被解析成一个URL树。 。
检查的root.children.primary.segments [ “0”]参数树的路径产生,我们希望看到反序列化对象:
而路由器参数订阅按预期观察这些参数:
然而,在一个矩阵参数(在该示例中为 'r')是这样一个URL编码JSON字符串,我们有:
再次,在root.children.primary.segments [ “0”]。树的参数路径,我们可以看到我们期望填充的对象(注意:括号已正确反序列化,此时字符串是有效的JSON,不是它应该重要,因为这只是一个简单的字符串字段):
除了这次,路由参数订阅观察一个空对象!
我怀疑的是,内容是由角消毒反序列化后,但我没能还证实了这一点。有什么建议么?
为什么不只是使用encodeURIComponent? –
@JuliaPassynkova:编码在我的代码和其他各种工具中都是有效的和解码无问题的。这个问题最终与范围有关。谢谢你的想法。 – CellularAutomaton
请包括代码作为文本,而不是图像。没有人会通过使用他们的代码图像来搜索类似的问题。 –