基于父行上的id获取子行中的数据,在datatable中使用两个ajax调用--jQuery

时间:2016-09-26 20:00:05

标签: javascript jquery html ajax datatables

我有一个数据表,它使用两个Ajax调用来加载数据。我在这里关注演示JSFiddle 我试图从第一个Ajax调用所有关于回复的数据,并将它们加载到父行。 然后我试图从第二个Ajax调用所有与回复相关的附件,通过回复ID,所以我想进入每个父行(回复id,以及与回复相关的其他数据),我想得到在子行中所有与此特定相关的附件(回复ID),[现在我使用fileName加载附件]

因此该表将加载所有回复,当用户单击第一个“td”打开子行时,用户必须只能看到与此回复相关的附件,并且当用户打开另一个子行时,会看到不同的附件,这些附件只与他点击“td”

的回复有关

我的问题是子行,它没有加载任何东西,当我在ajax调用中放入固定id时,它会在所有子行中加载相同的文件,但我不希望这样,我想要每个孩子行只加载相关附件(通过回复ID附件)

我花了5天时间尝试,但我无法解决它,而且我也没有在网上发现任何可以帮助的类似问题。 是否有可能使用数据表实现我想要的?

这是我的HTML代码

<table id="replyTable" class="display table-bordered nowrap" cellspacing="0" width="100%">
    <thead>
        <tr>
            <th>Attachments</th>
            <th>Reply ID</th>
            <th>Ticket ID</th>
            <th>Message</th>
            <th>Transaction Status</th>
            <th>Created Date</th>
        </tr>
    </thead>
    <tbody></tbody>
</table>

这是我的JS代码

 <script>   
        $(document).ready(function () {

            var TicketID = $("#txtTicketID").val();
            var table = $('#replyTable').DataTable({
                ajax: {
                    type: "GET",
                    url: "/api/TicketsReplies/GetTicketsRepliesByTicketID/" + TicketID,
                    dataSrc: "",
                    datatype: 'json',
                    cache: false,
                },
                columns: [
                    {
                        className:      "details-control",
                        orderable:      false,
                        defaultContent: ""

                    },
                    {
                        className: "replyIdClass",
                        data: "id",

                    },
                    { data: "ticketsId" },
                    { data: "message" },
                    { data: "transactionStatus.nameEnglish" },
                    { data: "createdDate" }
                ],
                "order": [[1, 'asc']]

            });

            // Add event listener for opening and closing details
            $('#replyTable').on('click', 'td.details-control', function () {

                var tr = $(this).closest('tr');
                var row = $('#replyTable').DataTable().row(tr);

                if (row.child.isShown()) {
                    // This row is already open - close it
                    row.child.hide();
                    tr.removeClass('shown');
                } else {
                    // Open this row
                    format(row.child);
                    tr.addClass('shown');
                }
            });

            function format(callback) {
                var IdValue = $('#replyTable').find('.replyIdClass').text();
                $('.replyIdClass').each(function (i) {

                    var repId = $(this).text();

                    $.ajax({
                        url: '/api/TicketAttachmentApi/GetRepliesAttachments/' + repId,
                        dataType: "json",
                        complete: function (response) {
                            var data = JSON.parse(response.responseText);
                            console.log(data);
                            var tbody = '';

                            $.each(data, function (i, d) {
                                tbody += '<tr><td>' + d.fileName + '</td><td>' + d.id + '</td></tr>';
                            });
                            console.log('<table>' + tbody + '</table>');
                            callback($('<table>' + tbody + '</table>')).show();
                        },
                        error: function () {
                            $('#output').html('Bummer: there was an error!');
                        }
                    });
                }); 
            } 

        });

    </script>

1 个答案:

答案 0 :(得分:2)

最后经过4天的尝试,我可以在更好地理解数据表和子行如何工作之后解决问题,所以我想把我的解决方案放在这里,所以也许我可以让那些有同样问题的人受益。 好吧这里的问题是在格式函数中使用foreach来获取回复id,这是错误的,我必须从我点击单元格的子行传递回复id,到格式函数并只检索回复id =的附件我点击的单元格中的回复ID

这是我的解决方案,它运作完美。 这是HTML

<input type="hidden" value='@ViewContext.RouteData.Values["id"]' id="txtTicketID" />

<table id="replyTable" class="display table-bordered table-hover" cellspacing="0" width="100%">
        <thead>
            <tr>
                <th>Attachments</th>
                <th>Reply ID</th>
                <th>Message</th>
                <th>Transaction Status</th>
                <th>Created Date</th>
            </tr>
        </thead>
        <tbody></tbody>
    </table>

这里是Ajax和jQuery代码

<script>
    $(document).ready(function () {

        var TicketID = $("#txtTicketID").val();
        // Get Replies From API by TicketID
        var table = $('#replyTable').DataTable({
            ajax: {
                type: "GET",
                url: "/api/TicketsReplies/GetTicketsRepliesByTicketID/" + TicketID,
                dataSrc: "",
                datatype: 'json',
                cache: false,
            },
            columns: [
                {
                    className: "details-control",
                    orderable: false,
                    defaultContent: ""
                },
                {
                    className: "replyIdClass",
                    data: "id",
                },
                {
                    data: "message",

                },
                { data: "transactionStatus.nameEnglish" },
                { data: "createdDate" }
            ],
            "order": [[1, 'asc']]

        });

        // Add event listener for opening and closing details
        $('#replyTable').on('click', 'td.details-control', function () {

            var id = $(this).closest("tr").find('.replyIdClass').text();
            var tr = $(this).closest('tr');
            var row = $('#replyTable').DataTable().row(tr);

            if (row.child.isShown()) {
                // This row is already open - close it
                row.child.hide();
                tr.removeClass('shown');
            } else {
                // Open this row
                format(row.child, id); // here pass the reply id to function format
                tr.addClass('shown');
            }
        });

        function format(callback, vRid) {

            var TicketID = $("#txtTicketID").val();

            var repId = $(this).text();
            $.ajax({
                type: "GET",
                url: "/api/TicketAttachmentApi/GetRepliesAttachments/" + vRid,
                dataType: "json",
                cache: false,
                complete: function (response) {
                    var data = JSON.parse(response.responseText);
                    console.log(data);
                    var tbody = "";

                    $.each(data, function (i, d) {
                        tbody += "<tr><td><a href='/Attachments/Tickets/" + TicketID + "/Replies/"
                          + vRid + "/" + d.fileName + "' target='_blank'>" + d.fileName + "</a></td></tr>";
                    });
                    console.log("<table>" + tbody + "</table>");
                    callback($("<table>" + tbody + "</table>")).show();
                },
                error: function () {
                    $('#output').html('Bummer: there was an error!');
                }
            });
        } //-- end format (callback)

    });

</script>