2013-02-20 8 views
16

Używam d3.json, aby uzyskać dane dynamiczne.Jak wysłać parametr do d3.json?

d3.json("/myweb/totalQtyService.do", function(json) { 

    drawChart(json); 
}); 

Jak mogę napisać parametru na d3.json? tj

dane: { roku: "2012", klientów: „type1“ }?

Każdy pomysł przeniesienia tych parametrów na stanowisku nie URL parametr /myweb/totalQtyService.do?year=2012 & Klient = type1

próbowałem takich poniżej, ale nie mógł tego dokonać. ponieważ struktura danych tak różne

d3.json => [Object, Object, Object, Object]

$ .ajax => {ENTITY_NAME: "ACTIVA" entity_tar_val: 350entity_val: 400level: 1_ proto _: Przedmiot} ...

$.ajax({ 
    type: "POST", 
    url: url, 

    // parameter here 
    data : {year: "2012", customer: "type1“}, 
    success: function(json){ 
     // console.log(json); 
     **drawChart(json);** 
    } , 
    error:function (request, err, ex) { 
    } 
}); 

Odpowiedz

23

UWAGA: Ta odpowiedź odnosi się do starszej wersji d3 .json, zobacz komentarz Joshua Taylora poniżej.


d3.json jest d3.xhr wygodną metodą owijania; jest trudne do wykonania żądania GET.

Jeśli chcesz POST, możesz bezpośrednio użyć numeru d3.xhr.

coś takiego:

d3.xhr(url) 
    .header("Content-Type", "application/json") 
    .post(
     JSON.stringify({year: "2012", customer: "type1"}), 
     function(err, rawData){ 
      var data = JSON.parse(rawData); 
      console.log("got response", data); 
     } 
    ); 

Ponieważ nie callback jest określony w tworzeniu obiektu żądania nie wysłał natychmiast. Po otrzymaniu odpowiedzi JSON można przeanalizować w standardowy sposób JavaScript, tj. JSON.parse(data) Dokumentacja d3.xhr to here.

+0

Lista parametrów wywołania zwrotnego powinna być funkcją (błąd, dane). Przesłałem zmianę. – anderspitman

+0

Również zapomniałeś o wiązaniu obiektu do JSON – anderspitman

+0

Dzięki :). Osobiście uważam, że mój oryginał jest bardziej zrozumiały (nie można znieść argumentów wywołania zwrotnego i uszeregowania). Moim celem było podanie najmniejszego przykładu ogólnej prośby XHR, pozostawiając rozpatrywanie odpowiedzi jako odrębny problem - chociaż wspomniałem o najbardziej oczywistym sposobie na odpowiedź. Podobnie zdecydowałem się wyraźnie podzielić ten przykład na dwa etapy - utworzenie i wykonanie żądania - zamiast łączenia dwóch w jedno wyrażenie w celu wyjaśnienia odpowiedzialności każdego wywołania funkcji. Zadowoleni z akceptacji edycji, jeśli ludzie uważają ją za bardziej pomocną. –

8

Można też spróbować:

d3.json(url,function(error, data) { 
     ... 
    }) 
    .header("Content-Type","application/json") 
    .send("POST", JSON.stringify({year: "2012", customer: "type1"})); 
+0

Wygląda na to, że działa, ale jest niepoprawny. Część d3.json (...) natychmiast wysyła żądanie HTTP - nie to, co chcesz. Wysyła następnie wykonuje * kolejne * wywołanie, tym razem, które chcesz. –

-1

Jeśli używasz rozpórki można określić adres URL i parametru:

<s:url action="jsondatatreeaction" var="jsonsearchTag" 
    namespace="/data"> 
    <s:param name="searchType" value="%{searchType}"></s:param> 
</s:url> 
. . . d3.json ("$ {jsonsearchTag}", funkcja (błąd, wyrównanie) { ... } . . .
0

Jeśli chcesz złożyć zamówienie takiego formularza HTML (przy użyciu parametrów zapytania), wtedy można zrobić:

d3.request("/path/to/resource") 
.header("X-Requested-With", "XMLHttpRequest") 
.header("Content-Type", "application/x-www-form-urlencoded") 
.post("a=2&b=3", callback); 

Zobacz docs tutaj: d3-request docs

Jeśli chcesz przekonwertować prosty obiekt do ciągu parametrów zapytania, można użyć następującej funkcji:

function obj2Params(params){ 
    var str = ""; 
    var amp = ""; 
    for(var p in params){ 
    if(params.hasOwnProperty(p)) { 
     str += amp + encodeURIComponent(p) + "=" + encodeURIComponent(params[p]); 
     amp = "&"; 
    } 
    } 
    return str; 
} 
+0

W przypadku obiektów głębokich, zobacz ten link, aby dowiedzieć się, jak zbudować ciąg kwerendy: https://stackoverflow.com/questions/1714786/query-string-encoding-of-a-javascript-object – juacala

Powiązane problemy