jQuery DataTables - 如何添加编辑和删除选项

8
我有以下代码:http://jsfiddle.net/5ooyertu/1/ 目前,表格通过服务器端正确地填充数据,并且我的分页功能正常工作。但我想添加删除或编辑行的功能。我想添加一个名为“操作”的列,其中包含两个链接 - 一个链接到编辑方法...另一个链接到删除方法。
在使用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>")
  }
}

如上述代码示例所示,我需要传递每行的一些数据,无论是作为查询字符串的一部分(在编辑的情况下)还是只是将它们作为参数传递给与此dataTable位于同一文件中的另一个名为“delete”的JavaScript函数。而且这是有条件的...意思是,超链接会根据grp是否为真/假而改变。
我想知道如何更改填充dataTable的逻辑以包括这两个超链接?
我发现了这个链接: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>';}
                }
        ]
    } );
    
} );

请注意调用render函数。我还在我的HTML代码中向我的表格添加了一列。我确实得到了超链接!但不幸的是,链接是错误的。row [0]返回“undefined”。而且,我仍然不知道如何根据字段“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>';}
                }
        ]
   });

现在我只需要想出如何将其变成有条件的。
3个回答

13

这里有一个例子,假设以下情况:

  • Ajax填充
  • 数据行是一个包含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 === 'something' ? 要显示的内容 : 另一个要显示的内容}
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
    }
}

你介意展示一下如何在我的JSFiddle代码中使用mrender吗?我正在阅读你提供的关于列的参考资料,但我还不清楚如何使用你的示例。另外,我该如何根据row [0] .destination的值更改超链接目标?抱歉问题比较多。 - dot
谢谢。但是row[0]返回了未定义的值。我需要一个条件语句...我在我的Edit 1中尝试解释。 - dot
你能调试并检查一下 row 是什么吗?顺便说一下:我在我的代码中做了一些更改,以允许通过 ajax 调用执行删除/编辑操作的可能性。你应该为 table-edittable-delete 创建一个点击回调函数。 - Claudio Redi
我已经使用 row.id 和 row.destination 使其正常工作了。但是超链接最终看起来像是“myservername/myappname/add.html?id="86"”,所以我必须想办法去掉 id 周围的引号。 - dot
让我们在聊天中继续这个讨论。点击此处进入聊天室 - dot
显示剩余2条评论

6

请看我的列部分片段

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文件的片段:

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

请注意,我正在使用ASP.Net MVC,因此Html.ActionLink只返回一个链接。
结果如下: enter image description here

非常感谢,这种方法帮助了我处理我的asp.net core 2 web应用程序。我能够添加mRender并利用linDetails轻松地添加删除和编辑链接。非常感谢。 - PatsonLeaner

1

谢谢。我认为从GUI表格中删除行是“容易的”,但我需要知道如何调用我的后端代码...以及如何创建编辑/删除选项。 - dot
哦,我明白你的意思。实际上,到目前为止我只使用过 jQuery DataTables 来展示数据。现在有机会进一步了解它。 - KidBilly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接