2012-05-09 3 views
1

私はこれで一日中立ち往生してしまいました。おそらく本当にシンプルなものかもしれませんが、ここに行きます。オブジェクトのJSON配列にアクセスできない、私を運転している

私は、注文のリストを取得するWebMethodを呼び出すjQuery.Ajaxメソッドを持っています。 jQueryの方法は、ここでは今、このWebMethod属性から

Orders

...

[WebMethod] 
    public static List<Order> GetOrdersByDept(Department department, Filter filter, DateTime? dateFrom = null, DateTime? dateTo = null) 
    { 
     return OrderLists.GetOrdersByDepartment(department, filter, dateFrom, dateTo); 
    } 

...この...

/* Get orders by the current logged in employee's department */ 
    function getOrdersByDept(department, filter, dateFrom, dateTo) { 
     var dto = {}; 
     dto['department'] = department; 
     dto['filter'] = filter; 
     dto['dateFrom'] = dateFrom; 
     dto['dateTo'] = dateTo; 
     $.ajax({ 
      type: 'POST', 
      url: 'ProcessPO.aspx/GetOrdersByDept', 
      data: JSON.stringify(dto), 
      contentType: 'application/json; charset=utf-8', 
      dataType: 'json', 
      success: function (data) { 
       displayOrders(data.d); 
      }, 
      error: function (xhr, status, errorThrown) { 
       alert(xhr.responseText); 
      } 
     }); 
    } 

戻り、このJSONでdisplayOrdersコードです。 ..

/* Fill the orders table. */ 
    function displayOrders(data) { 
     $('#gdvOrders tbody').empty(); 
     for (var key in data) { 
      var altRow; 
      if (key % 2 == 0) 
       altRow = 'class="alt-row"'; 
      else 
       altRow = ''; 
      /* Convert JSON formatted date to readable short date format */ 
      var orderDate = data[key].OrderDate.substr(6); 
      var currentTime = new Date(parseInt(orderDate)); 
      var month = currentTime.getMonth() + 1; 
      var day = currentTime.getDate(); 
      var year = currentTime.getFullYear(); 
      orderDate = day + "/" + month + "/" + year; 

      var orderStatus; 
      switch (data[key].Status) { 
       case 0: 
        orderStatus = 'Pending'; 
        break; 
       case 1: 
        orderStatus = 'Closed'; 
        break; 
      } 
      $('#gdvOrders tbody').append($('<tr ' + altRow + '><td>' + data.d[key].OrderId + '</td>' + 
               '<td>' + orderDate + '</td>' + 
               '<td>' + data[key].EmployeeName + '</td>' + 
               '<td>' + data[key].Items + '</td>' + 
               '<td>$' + data[key].SubTotal.toFixed(2) + '</td>' + 
               '<td>$' + data[key].TaxTotal.toFixed(2) + '</td>' + 
               '<td>$' + data[key].GrandTotal.toFixed(2) + '</td>' + 
               '<td>' + orderStatus + '</td></tr>')); 
     } 
     $('#gdvOrders tbody td:nth-child(4)').hide(); 
     $('#gdvOrders tbody td:nth-child(5)').hide(); 
     $('#gdvOrders tbody td:nth-child(6)').hide(); 
    } 

各注文は、基本的にリストであるアイテムのプロパティを保持します。私はそれをテーブルの4桁目に保存して隠します。ユーザーがテーブルの行/注文をクリックすると、別のテーブルに各アイテムの別のリストをロードします。あなたの閲覧のためにストリップダウン受注の行のためのクリック機能がこれです....

$('#gdvOrders tbody tr').live('click', function() { 
      displayItems($(this).find('td:nth-child(4)').text()); 
}); 

今displayItems機能は、このように定義されています...

function displayItems(data) 

私は別の多くを試してみました私が受け取るI ...

alert(data) 

データを反復処理する方法...

[object Object], [object Object] 

私はそれを試してみると(いくつかの異なる方法で試してみました)、私は定義されていません。[データ[0]を試してみると、データ1はoを表示します。基本的には、配列内のオブジェクトの代わりに[object Object]の各文字を返すだけです。私は間違って何をしていますか?

+1

Webサービスから戻ってくるJSONの例を投稿できますか? – jbabey

答えて

1

試してみてください。

 success: function (data) { 
      displayOrders(data.d); 
     }, 
+0

私の問題は解決していませんでしたが、コードを改善してdata.d [key] .propertyNameを反復する必要がなくなり、データ[key] .propertNameだけを実行できるようになりました。 –

1

変更これらの行

data: '{"department": "' + department + '", "filter": "' + filter + '", "dateFrom": "' + dateFrom + '", "dateTo": "' + dateTo + '"}', 
contentType: 'application/json; charset=utf-8', 
dataType: 'json', 

単に

data: dataObj, 
dataType: 'json', 

AJAXはあなたの便利に従ってJSONオブジェクトや配列でデータを作成する前に

var dataObj = {}; 
dataObj['department'] = department; 
dataObj['filter'] = filter; 
dataObj['dateFrom'] = dateFrom; 
dataObj['dateTo'] = dateTo; 

とデータで、このdataObjを使用して、データのjQuery自体は、コンソールを使用せずにここまで手に入れたこの

department=valueofdepartment&filter=valueoffilter&....

+0

オーダーを取得してテーブルに表示する方法はうまくいきますが、私はそれをあなたのメソッドに切り替えました。返された(データ)には、私が言ったように、うまく表示される注文が含まれていますが、各注文にはデータ(キー)があります.Itemsは注文(html)テーブルの列を非表示にしますが、オブジェクト。しかし、私がdisplayOrders(data)を呼び出すと、[O b j e c t O b j e c t]、[o b j e c t O b j e c t]などのように反復処理されます。それぞれのデータ[0]、データ[1]、データ[2]などについて... –

+0

また、私はデータを書く必要がありました:JSON.stringify(dataObj) –

+0

最初のコメントでは、displayItems(data)not not displayOrders(data)を繰り返し処理できないと言っています。 –

1

のようなキーと値のペアにdataObjを変換する送信中に、contentTypeのを削除しますか?

$.each(data, function(index, item) { 
    console.log(item); 
}); 

を使用し反復する

var key2 = data.key1.key2 

等...

alert()オブジェクトを表示しません、あなたがオブジェクトの構造を見るためにconsole.log(data)を使用する必要があり、その後、行いますまたは(あなたのスクリプトですでに使用されていますか?)

for (var key in data) { 
    console.log(data[key]); 
} 

一方、この:

$(this).find('td:nth-child(4)').text(); 

は、あなたのテキストの文字列ではなく、オブジェクト、その名のtext()を与えるだろう、それはあなたがdisplayItems()機能、textstringに渡しているものです、あなたの場合には、おそらくターゲットに当たって何も通過していないでしょう。

文字列にtext[4]を入力すると、文字列の5番目の文字が表示されます。

はやってみます

$('#gdvOrders tbody tr').live('click', function() { 
    var data = $(this).find('td:nth-child(4)').text(); 
    console.log(data); 
    displayItems(data); 
}); 

を、コンソールが言う参照してください?新しいバージョンのjQueryを使用している場合はon()に移動することを検討してください。

+0

console.log表示0 = [0 = 0 0 = b 0 = jなど...同じ問題です。 –

0

だから、最終結果はdisplayOrdersの行でなければなりませんでした...

+ '<td>' + data[key].Items + '</td>' + 

私が使用していた。..

+ '<td>' + JSON.stringify(data[key].Items) + '</td>' + 

そしてラインで

$('#gdvOrders tbody tr').live('click', function() { 
    displayItems($(this).find('td:nth-child(4)').text()); 
}); 

私はそれを...に変更しなければならなかった。

その後、私は...

function displayItems(data) { 
    for (var key in data) { 
     /* this can be accessed like */ 
     data[key].PropertyName 
    } 
} 

でそれを反復処理することができ

が起こっconversioningのビットのように思えるが、それは動作します。あなたのご意見ありがとうございました!

0

この問題は、AJAXの後、OO JSクラスメンバーへのアクセスを失ったことと似ています。解決策は簡単です。 $ .getJSON()を呼び出す前に、 'var obj = this;'を実行してください。 .done()の後にすべてのクラスメンバー/リソースにアクセスできます。

関連する問題