2017-05-05 102 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矩陣參數開始工作。