【问题标题】:DataTables: Show action button depending on queryDataTables:根据查询显示操作按钮
【发布时间】:2014-11-16 11:53:40
【问题描述】:

我有 jquery DataTables 通过 ajax 调用显示数据。 这一切都很好地加载,在最后一列,我添加了一个操作按钮,它将数据添加到另一个数据库。
但我似乎无法弄清楚如何解决一件事:
当按下按钮并且系统已将行数据添加到另一个数据库时,我不想在重新加载时再次显示该按钮。
我知道我当然需要我的 add-to-db 中所有行的 id,所以我做了一个 db 查询,返回所有已添加的行 id - 但是我如何检查 id 是否与中的行匹配我的表,然后不在 dataTables 中显示该行的按钮?
下面你可以看到我是如何设置我的数据表的:

var table = $('#user-table').DataTable({
    "destroy": true,
    "processing": false,
    "serverSide": false,
    "ajax": {
            "url": "myAjaxCall",
            "dataType": "json",
            "data": JSON.stringify(data()),
            "type": "GET",
            "dataSrc": "collection"
    },
    "columns": [
        {"data": "customerNumber"},
        {"data": "name"},
        {"data": "coNumber"},
        {"data": "city"},
        {"data": "email"},
        {"data": "balance"},
        {"data": null,
            "defaultContent": "<a href='#' class='myButton btn'>Add</a>",
            className: "center", "bSortable": false, "bSearchable": false}
    ]
});

我真的需要一些帮助 - 第一次使用 dataTables - 我喜欢它,但只需要让这个到达终点线 :-)

【问题讨论】:

  • 嗯,你能提供渲染HTML的例子吗?
  • 数据是否以 JSON 格式响应,确定吗?
  • 是的,它们以 json 格式响应。我将在几秒钟内更新 html

标签: javascript jquery mysql datatable


【解决方案1】:

你可以使用rowCallback函数。

var arrayOfAlreadyAddedRows = [1,5,7];  //Here is array you made from db.

"rowCallback": function( row, data ) {
    // I assume in your data you have a rowId column.

    if ( $.inArray(data.rowId, arrayOfAlreadyAddedRows ) !== -1 ) {
        $(row).find('td:eq(6)').html( "<a href='#' class='myButton btn'>Add</a>");
    }else{
       $(row).find('td:eq(6)').html("<b>Already added</b>");
    }
}

或者您已经在表格数据中标记了添加的行。类似于名为“已添加”的列,其值为 yes/no/

"rowCallback": function( row, data ) {
    if (data.added === "yes") {
        $(row).find('td:eq(6)').html("<a href='#' class='myButton btn'>Add</a>");
    }else{
        $(row).find('td:eq(6)').html("<b>Already added</b>");
    }
}

【讨论】:

  • 感谢回调的输入,我可以把它放在初始化的任何地方吗?每次我进行ajax调用时,第二种解决方案都会改变? inarray 函数是如何工作的?
  • 是的,你可以把它放在初始化中。当您从服务器获取表的数据时,将调用 rowCallback,然后在您的数据中指示添加了哪些行,哪些没有添加。在表初始化之前的第一个选项中。您制作了一个已添加行的数组。
  • 我的 arrayOfAlreadyAddedRows 作为 json 数组返回 - 我可以这样使用它吗?
【解决方案2】:

您可以简单地为您的按钮使用渲染函数;只需在 DataTable 初始化中添加一个 columnDefs 定义:http://www.datatables.net/examples/advanced_init/column_render.html

这使您可以在渲染元素之前做出合乎逻辑的决定。

var table = $('#user-table').DataTable({ 
.....
         "columnDefs": [
          {
           // The `data` parameter refers to the data for the cell (defined by the
           // `data` option, which defaults to the column being worked with, in
           // this case `data: 6`.
           "render": function ( data, type, row ) {
            //in here you should check if your button was clicked - if the id matches the id of a button     that was already  clicked - if that's the case just return an empty string otherwhise return a button:
            if(buttonClicked) //you need to write that logic obviously
            {
                return "";
            }else {
                return "<a href='#' class='myButton btn'>Add</a>";
            }

             },
             "targets": 6 //adjust as needed
           }

【讨论】:

  • 嗯,好的——我现在就试试这个解决方案。我想运行一个函数并根据动态返回值渲染输出没有问题?
  • 否 - 这是它的用例之一。您甚至可以返回一个标志作为 JSON 的一部分(一些聪明的东西喜欢 clicked : false ,然后根据该标志的值呈现。所以您不需要对点击的 id 发出另一个请求......但这取决于你;)
  • 我明白了 - 聪明 :) 但我从另一台服务器获取数据/ajax,所以我想这不是我的解决方案
  • 您仍然可以使用来自另一台服务器的 ajax - 首先从另一台服务器获取带有点击 id 的 ajax,然后在您的列渲染函数中,您可以将当前 id 与您返回的 id 列表进行比较
  • 这正是我现在想要做的。
猜你喜欢
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
相关资源
最近更新 更多