首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

easyui-datagrid 撤销修改有关问题

2013-01-17 
easyui-datagrid 撤销修改问题每当我执行添加,删除,更改等这些操作后,会在 onAfterEdit: function(rowInde

easyui-datagrid 撤销修改问题
每当我执行添加,删除,更改等这些操作后,会在
 onAfterEdit: function(rowIndex, rowData, changes){
   dataGridOper.datagrid('acceptChanges');
}执行这句话,但再次点击撤销就出问题了,
如图,操作前
easyui-datagrid 撤销修改有关问题

操作后如图
easyui-datagrid 撤销修改有关问题

我在点击取消编辑方法中看过,火狐控制台打印的红色代码那块全是空的,但页面数据却是出问题了,不知道什么原因

{
            handler: function(){
                //回滚自从创建以来或最后一次调用acceptChanges以来所有更改的数据
                console.info(dataGridOper.datagrid('getChanges','inserted'));
                console.info(dataGridOper.datagrid('getChanges','deleted'));
                console.info(dataGridOper.datagrid('getChanges','updated'));
                dataGridOper.datagrid('rejectChanges');
                editorRow = -1;

            }
        }

js代码


var dataGridOper;

$.extend($.fn.datagrid.methods, {
    //增加时有编辑框
    //第一个参数组件本身,第二个参数要传递的参数
    addEditor: function(jq, param){
        if (param instanceof Array) {
            $.each(param, function(index, item){
                var e = $(jq).datagrid('getColumnOption', item.field);
                e.editor = item.editor;
            });
        }
        else {
            var e = $(jq).datagrid('getColumnOption', param.field)
            e.editor = param.editor;
        }
    },
    //修改时没编辑框
    //编辑时使用可以跳过指定的列编辑,对某些列不需要编辑
    // 如 datagrid('removeEditor','password'),不让编辑密码
    removeEditor: function(jq, param){
        if (param instanceof Array) {
            $.each(param, function(index, item){
                var e = $(jq).datagrid('getColumnOption', item);
                e.editor = {};
            });
        }
        else {
            var e = $(jq).datagrid('getColumnOption', param)


            e.editor = {};
        }
    }
})



function getRootPath(){
    var curWwwPath = window.document.location.href;
    var pathName = window.document.location.pathname;
    var pos = curWwwPath.indexOf(pathName);
    var localhostPaht = curWwwPath.substring(0, pos);
    var projectName = pathName.substring(0, pathName.substr(1).indexOf('/') + 1);
    return (localhostPaht + projectName);
}

$(function(){
    operateDataGrid();
});


var operateDataGrid = function(){

    //用于存放操作记录
    var operator = "";
    //存放编辑的行号
    var editorRow = -1;
    dataGridOper = $('#dataGrid').datagrid({
        url: getRootPath() + '/operateDataGrid?operator=selectData',
        method: 'post',
        title: '用户信息',
        fitColumns: true,
        width: '100%',
        height: 335,
        loadMsg: 'loading',
        columns: [[{
            field: 'oid',
            title: '编号',
            width: 100,
            align: 'center',
            //设置可以排序,则不显示此列
            checkbox: true
        }, {
            field: 'username',
            title: '姓名',
            width: 100,
            align: 'center',
            //设置可以排序
            sortable: true,
            editor: {
                //string,object string 时指编辑类型,当 object 是options:对象,编辑类型对应的编辑器选项
                type: 'validatebox',
                options: {
                    required: true
                }
            }
        }, {


            field: 'gender',
            title: '性别',
            width: 100,
            align: 'center',
            sortable: true,
            editor: {
                type: 'validatebox'
            }
        }, {
            field: 'phonenum',
            title: '电话',
            width: 100,
            align: 'center',
            sortable: true,
            editor: {
                type: 'text',
                options: {
                    required: true
                }
            }
        }]],
        pagination: true,
        toolbar: [{
            id: 'idEdit',
            text: '修改',
            iconCls: 'icon-edit',
            disabled: enable,
            handler: function(){
                //控制一次只能编辑一行
                var rows2 = dataGridOper.datagrid('getSelections');
                //console.info(rows2[0]);
                //一次只能编辑一行
                if (rows2.length == 1) {
                    //判断是否有其他行正在编辑
                    if (editorRow == -1) {
                        //不让编辑用户名
                        //dataGridOper.datagrid('removeEditor', ['username','']); 传多个对象
                        dataGridOper.datagrid('removeEditor', 'username');


                        
                        //返回指定行的索引,row 参数可以是一个行记录或者一个 id 字段的值
                        var index1 = dataGridOper.datagrid('getRowIndex', rows2[0]);
                        operator = "updateData";
                        //在第一行增加
                        //队列进行编辑时必须在columns中列设置editor属性
                        //开始对一行进行编辑,参数index 索引
                        dataGridOper.datagrid('beginEdit', index1);
                        
                        editorRow = index1;
                    }
                    else {
                        $.messager.confirm('提示', '是否保存正在修改的数据', function(btn2){
                            //点击确定则保存,否则取消
                            if (btn2) {
                                dataGridOper.datagrid('endEdit', editorRow);
                                //设置当前无正在编辑的行
                                editorRow = -1;
                            }
                        });
                    }
                }
                else {
                    $.messager.alert('提示', '一次只能对一行进行编辑', 'warning');


                }
            }
        }, '-', {
            id: 'idSave',
            text: '保存',
            iconCls: 'icon-save',
            //disabled: true,
            handler: function(){
                //结束对第一行进行编辑,参数index 索引
                if (editorRow != -1) {
                    dataGridOper.datagrid('endEdit', editorRow);
                }
            }
        }, '-', {
            id: 'idCancle',
            text: '取消编辑',
            iconCls: 'icon-undo',
            //disabled: true,
            handler: function(){
                //回滚自从创建以来或最后一次调用acceptChanges以来所有更改的数据
                console.info(dataGridOper.datagrid('getChanges','inserted'));
                console.info(dataGridOper.datagrid('getChanges','deleted'));
                console.info(dataGridOper.datagrid('getChanges','updated'));
                console.info(dataGridOper.datagrid('rejectChanges').length);
                dataGridOper.datagrid('rejectChanges');
                editorRow = -1;
            }
        }, '-'],
        onAfterEdit: function(rowIndex, rowData, changes){
            //获取最后一次提交以来更改的行,type 参数表示更改的行的类型,可能的值是:inserted、deleted、updated,等等。
            //dataGridOper.datagrid('getChanges', 'inserted');//用于判断是增删改的操作
            //当用户完成编辑一行时触发,参数包括rowIndex:编辑行的索引,从 0 开始
            //rowData:编辑行对应的记录 changes:更改的字段/值对
            var urlData = "";
            if (operator == "insertData") {


                urlData = "username=" + rowData.username + "&gender=" + rowData.gender + "&phone=" + rowData.phonenum;
            }
            else {
                urlData = "id=" + rowData.oid + "&gender=" + rowData.gender + "&phone=" + rowData.phonenum;
            }
            $.ajax({
                type: "POST",
                url: getRootPath() + '/operateDataGrid?operator=' + operator,
                data: urlData,
                dataType: 'text',
                success: function(msgResult){
                    //console.info(msgResult);
                    if (msgResult == "success") {
//提交自从被加载以来或最后一次调用acceptChanges以来所有更改的数据,
                        //保持该数据的状态,否则点击取消编辑,将会回到修改前的数据,相当于提交事务
                        dataGridOper.datagrid('acceptChanges');
                        //title, msg, icon, fn
                        $.messager.alert('系统提示', '保存成功', 'info', function(btn){
                            //回调函数
                            dataGridOper.datagrid('load');
                        });
                    }
                    else {
                        $.messager.alert('系统提示', '保存失败', 'error');
                        //回滚
                        dataGridOper.datagrid('rejectChanges');
                    }


editorRow = -1;
                },
                error: function(XMLHttpRequest, textStatus, errorThrown){
                    $.messager.alert('系统提示', '保存失败:' + textStatus, 'info')
                }
            });
            
        },
        onDblClickRow: function(rowIndex, rowData){
            //当用户双击一行时触发,参数包括,rowIndex:被双击行的索引,从 0 开始,rowData:被双击行对应的记录
            //双击行时进行编辑该行
            
            //控制一次只能编辑一行
            if (editorRow == -1) {
                operator = "updateData";
                //不让编辑用户名
                dataGridOper.datagrid('removeEditor', 'username');
                //在第一行增加
                //队列进行编辑时必须在columns中列设置editor属性
                //开始对一行进行编辑,参数index 索引
                dataGridOper.datagrid('beginEdit', rowIndex);
                editorRow = rowIndex;
            }
            else {
                $.messager.confirm('提示', '是否保存正在修改的数据', function(btn2){
                    //点击确定则保存,否则取消
                    if (btn2) {
                        dataGridOper.datagrid('endEdit', editorRow);
                        //设置当前无正在编辑的行
                        editorRow = -1;
                    }
                });
            }
        
        } 


    });
}

html页面代码

<body>
  <div width="100%">
  <table id="dataGrid"></table>
 </div>
</body>


[解决办法]
可能是自带的bug

试试
//获取总数
                var paper = dataGridOper.datagrid('getPager');
                var total = paper.pagination('options').total;
                //回滚自从创建以来或最后一次调用acceptChanges以来所有更改的数据
                dataGridOper.datagrid('rejectChanges');
                //重新设置总数
                paper.pagination({
                    total: total
                });

热点排行