1

私はこれに1日立ち往生していて、私は正気を失っています。おそらく本当に単純なものですが、ここに行きます。

Ordersのリストを取得するWebMethodを呼び出すjQuery.Ajaxメソッドがあります。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を返します...

注文

このWebメソッドから...

[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();
    }

各注文には、基本的にリストであるアイテムのプロパティがあります。それを表の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]

それを反復しようとすると(いくつかの異なる方法を試しました)、未定義になるか、[data [0]を試すと、データ1にoなどが表示されます。基本的には、配列内のオブジェクトではなく、[objectObject]の各文字を返すだけです。私は何が間違っているのですか?

4

5 に答える 5

1

試す:

        success: function (data) {
            displayOrders(data.d);
        },
于 2012-05-09T19:38:37.980 に答える
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&....

于 2012-05-09T19:39:49.457 に答える
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()です。または、おそらくターゲットにヒットせず、何も渡していません。

文字列に対して実行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() への移行を検討してください。

于 2012-05-09T19:41:11.240 に答える
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
    }
}

少し変換が行われているように見えますが、機能します。ご意見をお寄せいただきありがとうございます。

于 2012-05-09T23:02:22.513 に答える
0

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

于 2014-09-11T22:11:56.037 に答える