2017-01-20 39 views
7

Jestem nowy w Angular2. Mam obiektu JSON, jak poniżej:Jak przekonwertować JSON na ciąg zapytania w angular2?

var options = { 
    param1: "parama1", 
    param2: "parama2", 
    param3: "parama3" 
}; 

która powinna przekształcić ciąg kwerendy i dołączyć do zewnętrznego URL przekierowania strony jak poniżej:

ngOnInit(){ 
    window.location.href = someurl?param1=param1&param2=param2&param3=param3; 
} 

szukam sposobu na przekonwertuj go na ciąg zapytania. W JQuery dostępne są $.param() i AngularJS $httpParamSerializerJQLike(). Szukałem, ale nie mam nic. Chciałbym wiedzieć, czy jest jakiś sposób, aby to zrobić w kanoncie2.

+0

Możliwy duplikat [Jak przekazywać argumenty URL (ciąg zapytania) do żądania HTTP w Angular 2] (http://stackoverflow.com/questions/34475523/how-to-pass-url-arguments-query-string -to-a-http-request-on-angle-2) – AArias

+1

Nie chcę wywoływać żadnego HTTP get lub post. Zmienię window.location.href. –

+0

Musisz spojrzeć na to [odpowiedź] (http://stackoverflow.com/questions/34475523/how-to-pass-url-arguments-query-string-to-a-http-request-on-angular-2) –

Odpowiedz

30

bardziej „oficjalny” sposób bez concats smyczkowych:

import {URLSearchParams} from '@angular/http' 
let options = { 
    param1: "param1", 
    param2: "param2", 
    param3: "param3" 
}; 

let params = new URLSearchParams(); 
for(let key in options){ 
    params.set(key, options[key]) 
} 

console.log("http://someUrl?" + params.toString()); 

robi to automatyczne kodowanie na drodze.

+0

Podoba mi się ta odpowiedź lepiej niż moja, dobra. – AArias

+0

@sitchie - Odrzuciłem proponowaną zmianę. Parametry są już URLEncoded, jeśli używasz tej metody. – MikeOne

+0

Mam to, ale nie ma sposobu na odwrócenie. –

1

Jak o tym:

ngOnInit(){ 
    let options = { 
     param1: "param1", 
     param2: "param2", 
     param3: "param3" 
    }; 

    let myQuery = 'http://someurl?' 
    for (let entry in options) { 
     myQuery += entry + '=' + encodeURIComponent(options[entry]) + '&'; 
    } 

    // remove last '&' 
    myQuery = myQuery.substring(0, myQuery.length-1) 

    window.location.href = myQuery; 
} 

myQuery wartość ?param1=param1&param2=param2&param3=param3.

+0

czy da zakodowany ciąg zapytania? –

+0

właśnie edytował odpowiedź, aby dodać kodowanie – AArias

+0

encodeURI ("param1 = param1 & param2 = param2 i param3 = http: //www.param4.com") daje "param1 = param1 & param2 = param2 & param3 = http://www.param4.com", kodowanie nie jest kodowane –

5

Rozwiązanie to będzie działać z większością typów złożonych

Okrywać ktoś zastanawiałem się, jak to zrobić, mam napisane rozszerzenie, które powinny współpracować z C# .NET 1.1 i rdzenia maszynopis 2.2.2 WebAPI który wygląda tak .

Pamiętaj, aby podać te dwa importu gdzie używasz go jako dobrze

import { URLSearchParams } from '@angular/http'; 
import 'rxjs/add/operator/map' 

export class QueryStringBuilder { 
    static BuildParametersFromSearch<T>(obj: T): URLSearchParams { 
     let params: URLSearchParams = new URLSearchParams(); 

     if (obj == null) 
     { 
      return params; 
     } 

     QueryStringBuilder.PopulateSearchParams(params, '', obj); 

     return params; 
    } 

    private static PopulateArray<T>(params: URLSearchParams, prefix: string, val: Array<T>) { 
     for (let index in val) { 
      let key = prefix + '[' + index + ']'; 
      let value: any = val[index]; 
      QueryStringBuilder.PopulateSearchParams(params, key, value); 
     } 
    } 

    private static PopulateObject<T>(params: URLSearchParams, prefix: string, val: T) { 
     const objectKeys = Object.keys(val) as Array<keyof T>; 

     if (prefix) { 
      prefix = prefix + '.'; 
     } 

     for (let objKey of objectKeys) { 

      let value = val[objKey]; 
      let key = prefix + objKey; 

      QueryStringBuilder.PopulateSearchParams(params, key, value); 
     } 
    } 

    private static PopulateSearchParams<T>(params: URLSearchParams, key: string, value: any) { 
     if (value instanceof Array) { 
      QueryStringBuilder.PopulateArray(params, key, value); 
     } 
     else if (value instanceof Date) { 
      params.set(key, value.toISOString()); 
     } 
     else if (value instanceof Object) { 
      QueryStringBuilder.PopulateObject(params, key, value); 
     } 
     else { 
      params.set(key, value.toString()); 
     } 
    } 

} 

To działa dla wszystkich typów złożonych używałem do tej pory.

+0

Tak jak w przypadku notatki, którą wywołujesz przy użyciu jedynej publicznej metody BuildParametersFromSearch –