BootStrap Table行内编辑

BootStrap Table行内编辑

BootStrap作为目前比较流行的一款前端框架,平时开发中也用到的很多,之前在写项目页面用的Bootstrap,数据展示用的BootStrap Table。因为项目需求,需要对表格中某些字段可以直接在表格中编辑保存。
对于BootStrap Table表格内编辑这里整理了两种方法。想了解BootStrap Table的小伙伴可以移步到Bootstrap Table数据表格的使用指南。

第一种方法

通过contenteditable属性设置元素的内容是可编辑。
优点:简单,代码量少。
缺点:由于BootStrap Table表格可以设置显示或隐藏列,所以指定某一列可编辑就比较麻烦。
方法思路
结合BootStrap Table中onClickCell单击单元格事件和onDblClickCell双击单元格事件属性来实现。根据项目需求设置单击或者双击事件触发编辑单元格内容事件。
在这里插入图片描述
在渲染表格属性时,添加单击单元格事件属性。
在这里插入图片描述
代码如下。

/**
 * onClickCell: 单击单元格触发
 * field    点击单元格的字段名称
 * value    点击单元格的数据值
 * row      点击列的整行数据
 * $element 当前点击td的Dom元素
 */
onClickCell: function(field, value, row, $element) {
    $element.attr('contenteditable', true);
    //元素失去焦点事件
    $element.blur(function() {
    	//单元格修改后的的值
        let tdValue = $element.html();

        console.log(field);
        console.log(tdValue);
        console.log(row);
    })
}

添加上面代码后,就可以看到单元格的可编辑效果了。如下图。
在这里插入图片描述
修改后的数据,单元格失去焦点后控制台输出的数据。
在这里插入图片描述
可以看出表格内容是修改了,但DOM中的当前行row内容却没有和表格中数据同步,需要通过表格的updateCell方法来更新一下单元格的数据。
在这里插入图片描述
修改后代码如下。

onClickCell: function(field, value, row, $element) {
        $element.attr('contenteditable', true);
        //元素失去焦点事件
        $element.blur(function() {
            //单元格修改后的的值
            let tdValue = $element.html();
            let index = $element.parent().data('index');

            //updateCell更新某单元格数据
            $("#tbClass_table").bootstrapTable('updateCell', {
                index: index,       //行索引
                field: field,       //列名
                value: tdValue        //cell值
            })

            console.log(field);
            console.log(tdValue);
            console.log(row);
        })
    }
});

控制台输出内容。
在这里插入图片描述
但DOM中的当前行row内容是和表格中是同步的。之后就可以把修改的数据保存到数据库中了。
在这里插入图片描述
通过AJAX向后台发送编辑保存的请求即可。参数因为row中的数据是和表格中的数据通路边的,所以可以直接把row整体当做参数传递到后台进行修改保存。传递的参数中第一个参数是表格前的复选框值,后台不做处理就可以了。
在这里插入图片描述
到这里第一种方法就写完了。下面来看一下第二种方法。

第二种方法

通过bootstrap-editable插件来实现。editable组件是一款用于创建可编辑弹出框的插件,封装的很全面,也很好用。
bootstrap-editable下载地址。
方法思路
和第一种方法一样结合BootStrap Table中onClickCell单击单元格事件和onDblClickCell双击单元格事件属性来实现。根据项目需求设置单击或者双击事件触发编辑单元格内容事件。
之后第一步当然是引入相关的文件了。

<link href="static/bootstrap3-editable/css/bootstrap-editable.css" type="text/css" rel="stylesheet" />
<script src="static/bootstrap3-editable/js/bootstrap-editable.js"></script>
<script src="static/bootstrap3-editable/js/bootstrap-table-editable.js"></script>

其中bootstrap-table-editable.js是下载文件中没有的。bootstrap-table-editable.js其实是对editable做了一个简单的封装,增加了列的editable属性以及编辑保存后的一些事件。使其对表格的操作更简单。bootstrap-table-editable.js文件代码如下。

/**
 * bootstrap-table-editable.js
 * @author zhixin wen <wenzhixin2010@gmail.com>
 * extensions: https://github.com/vitalets/x-editable
 */

!function ($) {

    'use strict';

    $.extend($.fn.bootstrapTable.defaults, {
        editable: true,
        onEditableInit: function () {
            return false;
        },
        onEditableSave: function (field, row, oldValue, $el) {
            return false;
        },
        onEditableShown: function (field, row, $el, editable) {
            return false;
        },
        onEditableHidden: function (field, row, $el, reason) {
            return false;
        }
    });

    $.extend($.fn.bootstrapTable.Constructor.EVENTS, {
        'editable-init.bs.table': 'onEditableInit',
        'editable-save.bs.table': 'onEditableSave',
        'editable-shown.bs.table': 'onEditableShown',
        'editable-hidden.bs.table': 'onEditableHidden'
    });

    var BootstrapTable = $.fn.bootstrapTable.Constructor,
        _initTable = BootstrapTable.prototype.initTable,
        _initBody = BootstrapTable.prototype.initBody;

    BootstrapTable.prototype.initTable = function () {
        var that = this;
        _initTable.apply(this, Array.prototype.slice.apply(arguments));

        if (!this.options.editable) {
            return;
        }

        $.each(this.columns, function (i, column) {
            if (!column.editable) {
                return;
            }

            var _formatter = column.formatter;
            column.formatter = function (value, row, index) {
                var result = _formatter ? _formatter(value, row, index) : value;

                return ['<a href="javascript:void(0)"',
                    ' data-name="' + column.field + '"',
                    ' data-pk="' + row[that.options.idField] + '"',
                    ' data-value="' + result + '"',
                    '>' + '</a>'
                ].join('');
            };
        });
    };

    BootstrapTable.prototype.initBody = function () {
        var that = this;
        _initBody.apply(this, Array.prototype.slice.apply(arguments));

        if (!this.options.editable) {
            return;
        }

        $.each(this.columns, function (i, column) {
            if (!column.editable) {
                return;
            }

            that.$body.find('a[data-name="' + column.field + '"]').editable(column.editable)
                .off('save').on('save', function (e, params) {
                var data = that.getData(),
                    index = $(this).parents('tr[data-index]').data('index'),
                    row = data[index],
                    oldValue = row[column.field];

                row[column.field] = params.submitValue;
                that.trigger('editable-save', column.field, row, oldValue, $(this));
            });
            that.$body.find('a[data-name="' + column.field + '"]').editable(column.editable)
                .off('shown').on('shown', function (e, editable) {
                var data = that.getData(),
                    index = $(this).parents('tr[data-index]').data('index'),
                    row = data[index];

                that.trigger('editable-shown', column.field, row, $(this), editable);
            });
            that.$body.find('a[data-name="' + column.field + '"]').editable(column.editable)
                .off('hidden').on('hidden', function (e, reason) {
                var data = that.getData(),
                    index = $(this).parents('tr[data-index]').data('index'),
                    row = data[index];

                that.trigger('editable-hidden', column.field, row, $(this), reason);
            });
        });
        this.trigger('editable-init');
    };

}(jQuery);

在渲染表格数据时,设置某列可以编辑。

{
    field: 'grade',
    title: '成绩',
    valign: 'middle',
    halign: 'center',
    align: 'center',
    editable: {
        type: 'text',
        title: '成绩',
        //添加效验规则
        validate: function (value) {
            if (!value){
                return '成绩不能为空';
            }
            var regPos = /^\d+(\.\d+)?$/; //非负浮点数
            if(!regPos.test(value)) {
                return "请输入有效的成绩";
            }
        }
    }
}

设置完成就可以看到效果了。
在这里插入图片描述
同样在渲染表格数据时,添加onEditableSave属性。通过onEditableSave方法可以监听输入内容后确定。在此方法中可以通过AJAX请求提交保存修改后的数据。代码如下。

//编辑单元格后保存。
//field 编辑的字段
//row   编辑的当前行
//oldValue  编辑前元素的值。
onEditableSave: function (field, row, oldValue, $el) {
    $.post('student/updateGrade', {id: row.id, grade: row.grade}, function(){
    });
}

后台updateGrade修改保存方法。

@RequestMapping(value = "/updateGrade")
@ResponseBody
public Object updateGrade(Integer id, double grade) {
    try {
        Student stu = studentService.findById(id);
        stu.setGrade(grade);
        studentService.save(stu);
        return new AjaxResult("数据修改成功");
    } catch (Exception e) {
        return new AjaxResult(false, "数据修改失败");
    }
}

在这里插入图片描述
点击确定保存后AJAX会向后台发送请求保存修改信息。
需要了解Bootstrap-Switch开关控件的请移步:Bootstrap-Switch开关控件使用指南。

  • 24
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
### 回答1: Bootstrap Table是一个基于Bootstrap的可扩展表格插件,支持行内编辑功能。通过设置editable选项为true,可以启用行内编辑功能。当用户单击单元格时,单元格将变为可编辑状态,用户可以在单元格中输入新值。当用户完成编辑并按下Enter键或单击其他单元格时,新值将保存到数据源中。同时,Bootstrap Table还提供了许多事件和方法,可以帮助您更好地控制行内编辑功能。 ### 回答2: Bootstrap Table是一种基于Bootstrap构建的灵活的、强大的、直观的、易于使用的表格插件。Bootstrap Table提供了许多功能,其中之一就是行内编辑Bootstrap Table行内编辑功能让用户能够直接在表格中编辑数据,这一功能非常实用且节省时间。 使用Bootstrap Table行内编辑功能时,我们需要将表格的editable选项设置为true。这样可以启用行内编辑功能,并且可以配置每个单元格的编辑器。Bootstrap Table支持多种类型的编辑器,包括文本框、下拉框、日期选择器等。 当用户点击单元格时,该单元格将变为可编辑状态,并且显示相应的编辑器。用户可以通过编辑器修改单元格中的内容。当用户完成编辑时,可以点击单元格以外的区域或按下Enter键保存修改,或者按下Esc键取消修改。 在使用Bootstrap Table行内编辑功能时,还可以配置编辑后的事件。可以在编辑后执行一些自定义的操作,例如更新数据库、重新计算数据、刷新表格等。此外,也可以配置编辑时和编辑完成时的样式,以增强用户体验。 通过以上方式,我们可以使用Bootstrap Table行内编辑功能来编辑表格中的数据。行内编辑是一种非常实用且方便的功能,能够提高数据处理的效率,减少工作量,增强用户体验。 ### 回答3: BootstrapTable是一种流行的基于Bootstrap的表格插件。BootstrapTable行内编辑功能为用户带来了更改表格内容的便利性。 在BootstrapTable中,行内编辑可以通过两种方式实现:弹出式编辑和内联编辑。 弹出式编辑需要通过设置editable: { popup: true }来启用。这将在单击编辑图标时弹出编辑表单。通过设置编辑类型(例如输入框、下拉框等)并提供保存和取消按钮,用户可以在编辑表单中修改数据。在保存时,表格将更新相应的数据。如果取消编辑,表格将回到原始状态。 内联编辑需要通过设置editable: { mode: "inline" }来启用。这将允许用户直接在表格中编辑数据。单击单元格时会显示编辑框。用户可以在编辑框中进行更改,然后按Enter键将更改保存到表格中。对于文本和数字数据,BootstrapTable提供输入框。对于日期数据,它提供日期选择器。对于下拉框数据,它提供下拉框。 此外,BootstrapTable还支持行内编辑时的回调函数。这些函数将使开发人员能够检查用户的更改,并根据需要执行其他操作。如果用户只需更改数据而不需要执行其他操作,则无需编写回调函数。 BootstrapTable行内编辑功能是一个非常有用的功能,可以使表格操作更加方便和快捷。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值