【问题标题】:jquery dataTables - how to add an edit and delete optionjquery dataTables - 如何添加编辑和删除选项
【发布时间】:2015-06-03 17:37:55
【问题描述】:

我有以下代码:http://jsfiddle.net/5ooyertu/1/

现在,表格正在通过服务器端正确填充,并且我的分页工作正常。但我想添加删除和/或编辑行的功能。我想添加一个名为“Actions”的列,该列有两个 - 一个用于编辑方法...,另一个用于删除方法。

在使用 dataTables 之前,我有一些 JavaScript 逻辑可以遍历 Ajax 中的记录数组,调用并使用数据和适当的超链接填充常规表。

 for (var i=0; i < data.length; i++) {
  if (data[i].grp == 0) {
     tr.append("<a href='add.html?id=" + data[i].id + "&pid=" + data[i].pid + "&destination=" + data[i].destination + "&name=" + data[i].name.replace("'", "%27") + "'</a><button class='btn btn-xs btn-primary'>Edit</button>&nbsp;</td>");
     tr.append("<button class='btn btn-xs btn-primary' onclick='delete(" + data[i].id + "," + data[i].pid + ");'>Delete</button></td>")

 } else {
     tr.append("<a href='update_group.html?id=" + data[i].id + "&pid=" + data[i].pid + "&destination=" + data[i].destination + "&name=" + data[i].name.replace("'", "%27") + "'</a><button class='btn btn-xs btn-primary'>Edit</button>&nbsp;</td>");
     tr.append("<button class='btn btn-xs btn-primary' onclick='delete(" + data[i].id + "," + data[i].pid + ",true);'>Delete</button></td>")
  }
}

从上面的代码示例中可以看出,在我的超链接中,我需要从每一行传递一些数据,或者作为查询字符串的一部分(在编辑的情况下)或者只是将它们传递为另一个名为“delete”的 JavaScript 函数的参数,该函数与此数据表位于同一文件中。而且它是有条件的...意思是,超链接会根据 grp 是真还是假而改变。

我想知道如何将填充数据表的逻辑更改为现在包含这两个超链接?

我找到了这个链接:http://datatables.net/forums/discussion/5862/creating-an-action-column-for-icons-view-edit-delete# 但是代码对我不起作用,我想我在某处读到 fnRender 方法现在已被弃用。

如果您有任何建议,我将不胜感激。

编辑 1

我尝试将我的代码更改为如下所示:

$(document).ready(function() {
    var selected = [];
    $('#users').DataTable( {

        "serverSide": true,
        "ordering": false,
         aLengthMenu: [
                [10, 25, 50, 100, "-1"],
                [10, 25, 50, 100, "All"]
        ],
        "ajax": "/cgi-bin/test",
        "rowCallback": function( row, data ) {
            if ( $.inArray(data.DT_RowId, selected) !== -1 ) {
                $(row).addClass('selected');
            }
        },
        "columns": 
        [    
                { "data": "id" ,"searchable":false},
                { "data": "name","searchable":true},    
                { "data": "pid", "searchable":true },    
                { "data": "destination", "searchable":true },
                {"mRender": function ( data, type, row ) {
                        return '<a href=add.html?id="'+row[0]+'">Edit</a>';}
                }
        ]
    } );
    
} );

注意对渲染的调用引用。我还在我的 html 代码中的表中添加了一个新列。我确实得到了一个超链接!但不幸的是,链接不正确。行 [0] 返回“未定义”。另外,我仍然不知道如何根据字段“destination”的值更改我创建的超链接。 例如,我想做这样的事情:(伪代码)

if row[i].destination = 'Group' then
                    {"mRender": function ( data, type, row ) {
                            return '<a href=group.html?id="'+row[0]+'">Edit</a>';}
                    }
else
                    {"mRender": function ( data, type, row ) {
                            return '<a href=add.html?id="'+row[0]+'">Edit</a>';}
                    }
end

编辑 2

此代码似乎有效:

$(document).ready(function() {
    var selected = [];
    $('#users').DataTable( {

        "serverSide": true,
        "ordering": false,
         aLengthMenu: [
                [10, 25, 50, 100, "-1"],
                [10, 25, 50, 100, "All"]
        ],
        "ajax": "/cgi-bin/test",
        "rowCallback": function( row, data ) {
            if ( $.inArray(data.DT_RowId, selected) !== -1 ) {
                $(row).addClass('selected');
            }
        },
        "columns": 
        [    
                { "data": "id" ,"searchable":false},
                { "data": "name","searchable":true},    
                { "data": "pid", "searchable":true },    
                { "data": "destination", "searchable":true },
                {"mRender": function ( data, type, row ) {
                        return '<a href=add.html?id='+row.id+'>Edit</a>';}
                }
        ]
   });

现在我只需要弄清楚我将如何使它成为有条件的。

【问题讨论】:

    标签: javascript html jquery datatables


    【解决方案1】:

    这里有一个示例,假设如下:

    • 阿贾克斯人口
    • 数据行是一个包含 4 列的数组
    • 您的数据行包含第一列的 id
    • 你没有在桌子上显示 id 所以你把它隐藏了

    根据您的需要调整它应该不难。检查columns的使用情况

    var datatablesOptions = {
        "serverSide": true,
        "ajaxSource": '[yourAjaxUrl]',
        "processing": true,
        "columns": [
            { bVisible = false }, // assume this is the id of the row, so don't show it
            null,
            null,
            null,
            /* EDIT */ {
                mRender: function (data, type, row) {
                    return '<a class="table-edit" data-id="' + row[0] + '">EDIT</a>'
                }
            }
            /* DELETE */ {
                mRender: function (data, type, row) {
                    return '<a class="table-delete" data-id="' + row[0] + '">DELETE</a>'
                }
            },              
         ]
    };
    $('#table').dataTable(datatablesOptions);
    

    编辑

    如果您需要根据destination 有条件地渲染不同的东西,您可以这样做

    mRender: function (data, type, row) {
        if (row.destination == "d1") {
            return '<a href="destination1?id=' + row.id + '">EDIT</a>'
        }else (row.destination == "d2"){
            return '<a href="destination2?id=' + row.id + '">EDIT</a>'
        } else {
            // some error telling that destination value is unexpected
        }
    }
    

    【讨论】:

    • 您介意将 mrender 与我的 jsfiddle 代码一起展示给我吗?我只是在阅读您包含的有关列的参考资料……但我还不清楚如何使用您的示例。另外,如何根据 row[0].destination 的值更改超链接目标?很抱歉有很多问题。
    • 谢谢。但是 row[0] 返回一个未定义的值。我需要一个条件语句......我试图在我的编辑 1 中解释
    • 你能调试一下row是什么吗?顺便说一句:我对我的代码进行了更改,以允许通过 ajax 调用执行删除/编辑操作。您应该为table-edittable-delete 创建一个点击回调。
    • 我使用 row.id 和 row.destination 让它工作。但是超链接最终看起来像“myservername/myappname/add.html?id="86"。所以我必须以某种方式删除 id 周围的引号。
    • 关于如何测试 row.destination 的值然后根据值创建不同的超链接的任何想法?
    【解决方案2】:

    看看我的列片段部分

    columns: [
        { 'data': 'LastName' },
        { 'data': 'FirstMidName' },
        { 'data': 'EnrollmentDate' },
        {// this is Actions Column 
            mRender: function (data, type, row) {
                var linkEdit = '@Html.ActionLink("Edit", "Edit", new {id= -1 })';
                linkEdit = linkEdit.replace("-1", row.ID);
    
                var linkDetails = '@Html.ActionLink("Details", "Details", new {id= -1 })';
                linkDetails = linkDetails.replace("-1", row.ID);
    
                var linkDelete = '@Html.ActionLink("Delete", "Delete", new {id= -1 })';
                linkDelete = linkDelete.replace("-1", row.ID);
    
                return linkDetails + " | " + linkEdit + " | " + linkDelete;
            }
        }
    

    这是来自我的 Json 的 sn-p

    {ID: 1, LastName: "Alexander", FirstMidName: "Carson", EnrollmentDate: "/Date(1126386000000)/",…}
    

    请注意,我使用的是 ASP.Net MVC,所以 Html.ActionLink 只是返回一个链接

    结果是

    【讨论】:

    • 非常感谢,这种方法对我的 asp.net core 2 Web 应用程序有所帮​​助。我能够添加 mRender 并利用 linDetails 轻松拥有删除和编辑链接。非常感谢
    【解决方案3】:

    DataTables 支持编辑和删除操作。删除相当简单,如下所示:

    $('#id tbody').on('click', function(){
        table
            .row($(this).parents('tr'))
            .remove()
            .draw();
    });
    

    看看这个例子: https://editor.datatables.net/examples/simple/inTableControls.html

    【讨论】:

    • 谢谢。我认为从 gui 上的表中删除行是“容易的”,但我需要知道如何调用我的后端东西......以及如何首先创建编辑/删除选项。
    • 哦,我明白你的意思了。到目前为止,我实际上只使用 jQuery DataTables 来显示数据。现在有机会进一步研究。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 2017-08-01
    • 2019-08-21
    • 1970-01-01
    相关资源
    最近更新 更多