2012-05-09 34 views
1

我一直在此停留一天,現在我瘋了。可能很簡單,但在這裏。無法訪問JSON數組對象,令我瘋狂駕駛

我有一個jQuery.Ajax方法,它調用WebMethod來檢索Orders列表。 jQuery的方法是這樣的......

/* 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 ...

Orders

從這...的WebMethod

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

現在這裏是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(); 
    } 

每個訂單基本上都包含一個屬於List的Items。我將它存儲在表格的第4欄並隱藏它。當用戶點擊表格中的一行/訂單時,我想將每個項目的另一個列表加載到另一個表格中。對於剝離下來供你觀賞的訂單該行的點擊功能是這樣的....

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

現在displayItems函數定義爲這個...

function displayItems(data) 

我已經嘗試了很多不同的如何通過數據進行迭代,當我...

alert(data) 

我收到...

[object Object], [object Object] 

當我嘗試迭代它時(嘗試了幾種不同的方式),我得到了未定義的字符,或者[當我嘗試數據[0]時,數據1將顯示o等等等等。基本上只是讓我回到[對象對象]的每個字符而不是數組中的對象。我究竟做錯了什麼?

+1

你可以發佈一個你從Web服務中獲得的JSON的例子嗎? – jbabey

回答

1

嘗試:

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

沒有解決我的問題,但讓我的代碼更好,這樣我就不必遍歷data.d [key] .propertyName,現在可以執行data [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和刪除的contentType,在發送數據的jQuery本身將dataObj轉換成鍵值對這樣

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

+0

獲取訂單並將其顯示在表格中的方法工作正常,但我確實將它切換到了您的方法,因爲它更乾淨,所以非常感謝。這是事實上,返回的(數據)包含訂單,正如我所說,顯示正常,但每個訂單都有數據[鍵]。我將這些列隱藏在訂單(html)表中,但它確實持有Item數組對象。但是當我調用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(數據)而不是displayOrders(數據),我不能迭代。 –

1

你走到這一步不使用控制檯?

alert()不會顯示一個對象,你應該使用console.log(data)看清物體的結構,然後執行:

var key2 = data.key1.key2 

等等

要重複使用

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

或(已經在您的腳本中使用過)?

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

在另一方面,這樣的:

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

會給你的文本字符串,而不是一個對象,故名text(),那就是要傳遞什麼樣的displayItems()功能,一個textstring,或者在你的情況下,你可能沒有達到目標,也沒有任何傳球。

當在字符串上做text[4]時,它會得到字符串中的第五個字母。

嘗試做:

$('#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()); 
}); 

我不得不改變它...

$('#gdvOrders tbody tr').live('click', function() { 
    displayItems(JSON.parse($(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()之後訪問你所有的類成員/資源。