2017-05-05 98 views
0

我遇到了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树。 。

enter image description here

检查的root.children.primary.segments [ “0”]参数树的路径产生,我们希望看到反序列化对象:

enter image description here

而路由器参数订阅按预期观察这些参数:

enter image description here

然而,在一个矩阵参数(在该示例中为 'r')是这样一个URL编码JSON字符串,我们有:

enter image description here

再次,在root.children.primary.segments [ “0”]。树的参数路径,我们可以看到我们期望填充的对象(注意:括号已正确反序列化,此时字符串是有效的JSON,不是它应该重要,因为这只是一个简单的字符串字段):

enter image description here

除了这次,路由参数订阅观察一个空对象!

enter image description here

我怀疑的是,内容是由角消毒反序列化后,但我没能还证实了这一点。有什么建议么?

+0

为什么不只是使用encodeURIComponent? –

+0

@JuliaPassynkova:编码在我的代码和其他各种工具中都是有效的和解码无问题的。这个问题最终与范围有关。谢谢你的想法。 – CellularAutomaton

+0

请包括代码作为文本,而不是图像。没有人会通过使用他们的代码图像来搜索类似的问题。 –

回答

0

这最终成为一个范围界定/ DI问题。当我直接从一个组件中订阅路由参数(我将它推送到一个服务中)时,JSON矩阵参数开始工作。