datatables異步獲取數據、簡單實用


IKC項目總結

一、認證難題管理模塊

1、 如何使用datatables進行獲取數據內容

datatables簡介:Datatables是一款jquery表格插件。它是一個高度靈活的工具,可以將任何HTML表格添加高級的交互功能。

  • 分頁,即時搜索和排序

  • 幾乎支持任何數據源:DOM, javascript, Ajax 和 服務器處理

  • 支持不同主題 DataTables, jQuery UI, Bootstrap, Foundation

  • 各式各樣的擴展: Editor, TableTools, FixedColumns ……

  • 豐富多樣的option和強大的API

  • 支持國際化

  • 超過2900+個單元測試

  • 免費開源 ( MIT license )! 商業支持

  • 更多特性請到官網查看

    如圖:從數據庫中訪問到的數據存到list集合中,並且將list集合返回給前台頁面

    按照官網的要求,需要用戶自己將所需要js和css引入進來

    1. cdn方式

      //cdn.datatables.net/1.10.15/css/jquery.dataTables.min.css

      //cdn.datatables.net/1.10.15/js/jquery.dataTables.min.js

    2. 自己下載引入方式

      自己下載后引入:

      <script type="text/javascript" src="/js/assets/data-table/datatables.min.js"></script>
      <script type="text/javascript" src="/js/assets/data-table/dataTables.bootstrap4.min.js"></script>
      <script type="text/javascript" src="/js/assets/data-table/dataTables.buttons.min.js"></script>
      <script type="text/javascript" src="/js/assets/data-table/buttons.bootstrap.min.js"></script>
      <script type="text/javascript" src="/js/assets/data-table/jszip.min.js"></script>
      <script type="text/javascript" src="/js/assets/data-table/vfs_fonts.js"></script>
      <script type="text/javascript" src="/js/assets/data-table/buttons.html5.min.js"></script>
      <script type="text/javascript" src="/js/assets/data-table/buttons.print.min.js"></script>
      <script type="text/javascript" src="/js/assets/data-table/buttons.colVis.min.js"></script>
      <script type="text/javascript" src="/js/assets/init/datatables-init.js"></script>
      

      引入后項目中必須要有bootstrap的css和js。也需要有對datatables的初始化的js文件

    當引入后就需要將數據和table進行綁定:

    <table id="declarationList" class="table table-sm table-striped table-bordered text-center table-hover" style="margin-left: -32px;padding-right: 0px;width: -webkit-fill-available">
    
        <thead>
        <tr>
            <th>
                <input type="checkbox" class="myid2" name="checkAll" id="checkAll">
                <label for="checkAll" style="margin-bottom: 0px">難題序號</label>
            </th>
            <th>姓名</th>
            <th>難題名稱</th>
            <th>難題級別</th>
            <th>所屬行業</th>
            <th>企業</th>
            <th>關鍵字</th>
    
            <th>導出</th>
        </tr>
        </thead>
        <tbody>
        <!--開始遍歷結果集-->
        <!--開始遍歷結果集-->
        <#if casePassList??>
        <#list casePassList as cases>
        <tr>
            <td>
                <label class="checkbox-inline">
                    <input type="checkbox" class="myid2" name="items" id="items" value="${cases.proId}">${cases.proId}
                </label>
            </td>
            <td>
                ${cases.application.appName!""}
            </td>
            <!--標題,a屬性-->
            <td>
                <span>
                    <a href="/manage/case/displayCase/${cases.proId}">${cases.proTitle}</a>
                </span>
            </td>
            <!--難題級別-->
            <td>${cases.proLevel}</td>
            <!--所屬行業-->
            <td>${cases.proIndustry}</td>
            <!--來源企業-->
            <td>
                ${cases.proCompany}
            </td>
            <!--關鍵字-->
            <td>
                ${cases.proKeyword}
            </td>
            <!--操作-->
            <td>
                <a id="a_exportAllPassCase" style="margin-right: 10px;" href="/manage/case/exportApproveCase/${cases.proId}"><i class="fa fa-file-word-o" aria-hidden="true"></i>全部</a>
                <a id="a_exportPassSimpleCase" href="/manage/case/exportSimpleApproveCase/${cases.proId}"><i class="fa fa-file-word-o" aria-hidden="true"></i>簡介</a>
            </td>
        </tr>
        </#list>
        </#if>
    
    </table>
    

    一般來說,如果控制台報識別不了datatables,那就是沒有初始化表格

    $(document).ready(function () {
        $('#declarationList').DataTable();
    });
    

    這樣表格就可以使用了;需要注意的是,行和列需要保持一致,就是有多少個th對應多少個td,否則會alert出錯誤,alert的內容大概就是一個超鏈接,該鏈接會直接導向官網的報錯信息。


    上述的這種是最簡單的獲取數據,直接從控制台獲取得到的數據,項目中出來一個新的需求:用戶需要進行條件查詢。

    然后將條件查詢的結果渲染到datatables中去。這就是異步獲取數據。官網的介紹datatables可ajax異步獲取的數據形式有三種:

    官方文檔ajax 通俗的講就是獲取數據源,也就是從后台獲取到的list集合如何將該集合傳到前台頁面,三種方式:

    1. 第一種通過數組

    2. 第二種通過js的object對象傳遞

      image-20200229231237197

    3. 第三種通過staff屬性傳遞

image-20200229231313969

其實這些傳遞的方式不需要你管,我在使用的過程中,傳過來后直接使用的就是第一種通過array數組或者是json數據傳遞過來,你只需要做的是當你點擊查詢的之后,獲取到數據,然后在回調函數里面需要進行重新渲染。具體如下:

$("#btn_search").on('click', function () {
    //點擊后,需要想后台傳輸數據
    //0,申請人
    var pname = $("#proName").val();
    if (pname == null) {
        pname = "";
    }
    //1,傳送難度級別
    var pLevel = $("#proLevel option:selected").val();
    if (pLevel == null) {
        pLevel = "";
    }
    // 2,傳輸所屬行業
    var pIndustry = $("#proIndustry").val();
    if (pIndustry == null) {
        pIndustry = "";
    }
    //3,傳輸來源企業
    var pCompany = $("#proCompany").val();
    if (pCompany == null) {
        pCompany = "";
    }
    //4,傳輸關鍵字,
    var keyword = $("#proKeyword").val();
    if (keyword == null) {
        keyword = "";
    }
    //5,傳輸實現功能
    var pFunction = $("#proFunction").val();
    if (pFunction == null) {
        pFunction = "";
    }
    //6,傳輸難題名稱
    var pTitle = $("#proTitle").val();
    if (pTitle==null){
        pTitle="";
    }
    //7,傳值,證明是通過的
    var pState = '1';
    console.log(pState);
    if (pname.length == 0 && pLevel.length == 0 && pIndustry.length == 0 && pCompany.length == 0 && keyword.length == 0 && pFunction.length == 0 && pTitle.length == 0 && pTitle.length == 0) {
        alert("輸入參數有誤,請重新輸入");
    } else {
        $.ajax({
            type: "post",
            url: "/manage/case/search",
            dataType: "json",
            data:
                {
                    name: pname,
                    title: pTitle,
                    level: pLevel,
                    industry: pIndustry,
                    company: pCompany,
                    keyword: keyword,
                    state: pState
                },
            error: function () {
            },
            success: function (data) {
                console.log(data);
                if (data.searchResults==''||data.searchResults==null||data.searchResults.length==0){
                    alert("查無此數據,請重試!");
                    clearPassSearchContent();
                }else{
                    $('#declarationList').DataTable({
                        destroy: true,
                        searching:true,
                        paging: true,//表格分頁
                        data: data.searchResults,
                        columns: [
                            {
                                data: 'proId', render: function (data, type, row, meta) {
                                    return '<label class="checkbox-inline"><input type="checkbox" class="myid2" name="items" id="items" value="' + row.proId + '">' + row.proId + '</label>'
                                }
                            },
                            {data: 'application.appName'},
                            {
                                data: 'proTitle', render: function (data, type, row, meta) {
                                    return '<span><a href="/manage/case/displayCase/' + row.proId + '">' + row.proTitle + '</a></span>'
                                }
                            },
                            {data: 'proLevel'},
                            {data: 'proIndustry'},
                            {data: 'proCompany'},
                            {data: 'proKeyword'},
                            {
                                data: '', render: function (data, type, row, meta) {
                                    return ' <a id="a_exportAllPassCase" href="/manage/case/exportApproveCase/'+row.proId+'" style="margin-right: 10px;"><i class="fa fa-file-word-o" aria-hidden="true"></i>全部</a>\n' +
                                        '            <a id="a_exportPassSimpleCase" href="/manage/case/exportSimpleApproveCase/'+row.proId+'"><i class="fa fa-file-word-o" aria-hidden="true"></i>簡介</a>'
                                }
                            }
                        ],
                        language: {
                            "sProcessing": "處理中...",
                            "sLengthMenu": "顯示 _MENU_ 項結果",
                            "sZeroRecords": "沒有匹配結果",
                            "sInfo": "顯示第 _START_ 至 _END_ 項結果,共 _TOTAL_ 項",
                            "sInfoEmpty": "顯示第 0 至 0 項結果,共 0 項",
                            "sInfoFiltered": "(由 _MAX_ 項結果過濾)",
                            "sInfoPostFix": "",
                            "sSearch": "簡單搜索:",
                            "sUrl": "",
                            "sEmptyTable": "表中數據為空",
                            "sLoadingRecords": "載入中...",
                            "sInfoThousands": ",",
                            "oPaginate": {
                                "sFirst": "首頁",
                                "sPrevious": "上頁",
                                "sNext": "下頁",
                                "sLast": "末頁"
                            },
                            "oAria": {
                                "sSortAscending": ": 以升序排列此列",
                                "sSortDescending": ": 以降序排列此列"
                            }
                        }
                    });
                }
            }
        });
    }


});

當初寫的代碼有點啰嗦,有好多可以改進的地方,比如,

  1. 所有的var都改成let;

  2. var pname = $("#proName").val();
    if (pname == null) {
    pname = "";
    }

之所以需要判斷是否為空,是因為由於是條件搜索,所以有的條件可以為空,但是如果為空的話,如果不置為空字符串,將數據傳到后台的時候,直接報空指針異常的錯誤,所以在這里進行設置為空字符串。可以改進的地方,判斷是否為空,在js中可以直接使用 if(!pname)進行判斷,簡化代碼

當判斷完所有的時候,用戶將所需要查找的數據發送到后台,比如查找申請人是cym,難題名稱為測試難題,所屬行業為制造業的數據,后台的代碼先不贅述。總之數據庫如果有數據的話就返回一個list集合,然后傳到控制台后是一個array數組,接下來就是處理這個數組,並且將數組中的數據給datatable渲染。

 $('#declarationList').DataTable({
                    destroy: true,
                    searching:true,
                    paging: true,//表格分頁
                    data: data.searchResults,
                    columns: [
                        {
                            data: 'proId', render: function (data, type, row, meta) {
                                return '<label class="checkbox-inline"><input type="checkbox" class="myid2" name="items" id="items" value="' + row.proId + '">' + row.proId + '</label>'
                            }
                        },
                        {data: 'application.appName'},
                        {
                            data: 'proTitle', render: function (data, type, row, meta) {
                                return '<span><a href="/manage/case/displayCase/' + row.proId + '">' + row.proTitle + '</a></span>'
                            }
                        },
                        {data: 'proLevel'},
                        {data: 'proIndustry'},
                        {data: 'proCompany'},
                        {data: 'proKeyword'},
                        {
                            data: '', render: function (data, type, row, meta) {
                                return ' <a id="a_exportAllPassCase" href="/manage/case/exportApproveCase/'+row.proId+'" style="margin-right: 10px;"><i class="fa fa-file-word-o" aria-hidden="true"></i>全部</a>\n' +
                                    '            <a id="a_exportPassSimpleCase" href="/manage/case/exportSimpleApproveCase/'+row.proId+'"><i class="fa fa-file-word-o" aria-hidden="true"></i>簡介</a>'
                            }
                        }
                    ],
                    language: {
                        "sProcessing": "處理中...",
                        "sLengthMenu": "顯示 _MENU_ 項結果",
                        "sZeroRecords": "沒有匹配結果",
                        "sInfo": "顯示第 _START_ 至 _END_ 項結果,共 _TOTAL_ 項",
                        "sInfoEmpty": "顯示第 0 至 0 項結果,共 0 項",
                        "sInfoFiltered": "(由 _MAX_ 項結果過濾)",
                        "sInfoPostFix": "",
                        "sSearch": "簡單搜索:",
                        "sUrl": "",
                        "sEmptyTable": "表中數據為空",
                        "sLoadingRecords": "載入中...",
                        "sInfoThousands": ",",
                        "oPaginate": {
                            "sFirst": "首頁",
                            "sPrevious": "上頁",
                            "sNext": "下頁",
                            "sLast": "末頁"
                        },
                        "oAria": {
                            "sSortAscending": ": 以升序排列此列",
                            "sSortDescending": ": 以降序排列此列"
                        }
                    }
                });

如代碼所示,destroy: true, 這行是必須的,因為重新渲染的數據,所以必需將表格摧毀后重新渲染,searching:true,
paging: true,//表格分頁
這些表示可以搜索,表格進行分頁。

data: data.searchResults
這行的意思是表格的數據源是什么,也就是你model里面設置的返回list對象,比如:
List<Problem> results = caseService.searchByConditions(name, title, level, industry, company, keyword, state);
returnMap.put("searchResults", results);
3、4兩行代碼是后台查詢的結果。
columns: [
                        {
                            data: 'proId', render: function (data, type, row, meta) {
                                return '<label class="checkbox-inline"><input type="checkbox" class="myid2" name="items" id="items" value="' + row.proId + '">' + row.proId + '</label>'
                            }
                        },
                        {data: 'application.appName'},
                        {
                            data: 'proTitle', render: function (data, type, row, meta) {
                                return '<span><a href="/manage/case/displayCase/' + row.proId + '">' + row.proTitle + '</a></span>'
                            }
                        },
                        {data: 'proLevel'},
                        {data: 'proIndustry'},
                        {data: 'proCompany'},
                        {data: 'proKeyword'},
                        {
                            data: '', render: function (data, type, row, meta) {
                                return ' <a id="a_exportAllPassCase" href="/manage/case/exportApproveCase/'+row.proId+'" style="margin-right: 10px;"><i class="fa fa-file-word-o" aria-hidden="true"></i>全部</a>\n' +
                                    '            <a id="a_exportPassSimpleCase" href="/manage/case/exportSimpleApproveCase/'+row.proId+'"><i class="fa fa-file-word-o" aria-hidden="true"></i>簡介</a>'
                            }
                        }
                    ],

columns:表示的是渲染的每列的數據

 data: 'proId', render: function (data, type, row, meta) {
                                return '<label class="checkbox-inline"><input type="checkbox" class="myid2" name="items" id="items" value="' + row.proId + '">' + row.proId + '</label>'

這行就相當於html網頁中的

<label class="checkbox-inline">
    <input type="checkbox" class="myid2" name="items" id="items" value="${cases.proId}">${cases.proId}
</label>

只不過需要渲染,所以使用了datatable中的官方方法。其中需要將${cases.proId}改為row.proId,注意單引號的位置,正確的書寫------“‘+row.proId+’”;之后的每行都是,如果沒有數據可以設置為空,可以參考最后一行數據設置。如果單純的顯示數據,則參考 {data: 'proKeyword'},

這樣數據就得以渲染。

時間比較久遠,又是晚上寫的,如果有什么不懂得可以聯系我。

這篇文章的總結:

  1. 講解如何使用datatables接收后台的數據
  2. 用戶自定義異步獲取后台數據(比如自定義搜索、條件搜索)

正在努力更新筆記,寫的有可能沒有邏輯。勿噴。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM