2017-05-05 4 views
0

Ich habe ein Problem mit Angular2 Umgang mit URL-codierten JSON-Matrix-Parameter. Ich musste einen benutzerdefinierten UrlSerializer erstellen, um Klammern in String-Feldern innerhalb des JSONs zu behandeln. Zum Beispiel: User-Agent-Strings. Der Brauch Serializer wie folgt aussieht:Angular2 Url Encoded JSON Matrix-Parameter

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; 
    } 
} 

Wie Sie sehen können, ist die Klammer zusätzlich zu der Standard-Serialisierung serialisiert werden, die standardmäßig Klammern sind Sonderzeichen annimmt. Der Code funktioniert korrekt für einfache Werte. Hier werden zwei Matrixparameter ('comp_id' und 'camp_id') in einen URL-Baum geparst. .

enter image description here

den root.children.primary.segments Inspizieren [ "0"] Parameter Pfad des Baumes das Objekt ergibt, das wir sehen deserialisiert erwarten:

enter image description here

Und die Router params Abonnement beobachtet diese Parameter wie erwartet:

enter image description here

jedoch, in dem Fall, in dem ein Matrixparameter ('R' in diesem Beispiel) ist eine URL-Zeichenfolge codierte JSON haben wir:

enter image description here

Wieder in der root.children.primary.segments [ "0"]. Parameter Pfad des Baumes, wir können das Objekt sehen, das wir erwarten würden bevölkert () Hinweis: die Klammern sind richtig deserialisiert und die Zeichenfolge ist an dieser Stelle gültig JSON, nicht dass es wichtig sein sollte, da dies einfach ein ist Zeichenkettenfeld):

enter image description here

Außer dieses Mal beobachtet die Route Params Subscription ein leeres Objekt!

enter image description here

Mein Verdacht ist, dass der Inhalt von Angular nach der Deserialisierung hygienisiert werden, aber ich habe nicht in der Lage gewesen, dies noch zu bestätigen. Irgendwelche Vorschläge?

+0

warum nicht nur encodeURIComponent verwenden? –

+0

@JuliaPassynkova: Die Codierung ist gültig und dekodiert ohne Problem sowohl in meinem Code als auch in verschiedenen anderen Tools. Das Problem endete mit dem Geltungsbereich. Danke für die Idee. – CellularAutomaton

+0

Bitte Code als Text und keine Bilder einfügen. Niemand wird nach ähnlichen Fragen suchen, indem er ein Bild seines Codes verwendet. –

Antwort

0

Dies endete als Scoping/DI-Problem. Wenn ich die Route Params direkt von einer Komponente abonniere (ich hatte dies in einen Dienst geschoben), beginnen die JSON-Matrix-Parameter zu arbeiten.