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. .
den root.children.primary.segments Inspizieren [ "0"] Parameter Pfad des Baumes das Objekt ergibt, das wir sehen deserialisiert erwarten:
Und die Router params Abonnement beobachtet diese Parameter wie erwartet:
jedoch, in dem Fall, in dem ein Matrixparameter ('R' in diesem Beispiel) ist eine URL-Zeichenfolge codierte JSON haben wir:
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):
Außer dieses Mal beobachtet die Route Params Subscription ein leeres Objekt!
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?
warum nicht nur encodeURIComponent verwenden? –
@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
Bitte Code als Text und keine Bilder einfügen. Niemand wird nach ähnlichen Fragen suchen, indem er ein Bild seines Codes verwendet. –