easyui行編輯:利用append row添加行,直接在行中編輯,ajax提交保存

今天工作用到了easyui行編輯,在這裏總結一下,不會的同學可以看看,順便吐槽一下,網上的很多博客都是粘貼複製的,內容很亂 ,而且看不懂,不知道這些粘貼複製的懷的是什麼心,不但沒用,還影響別人搜索。
呼籲大家在寫博客的時候認真一些,別隻粘貼複製,至少可以自己運行好了貼上自己的代碼和一點感想,對別人用處很大的。

好了,正題開始——>

我用的是easyui 1.4

效果如下:
點擊添加按鈕,在第二行的位置添加新行,點擊單元格輸入內容,點保存通過ajax提交。
修改則直接點擊單元格修改,點保存提交。
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述

代碼如下:
首先table還是平常的table,只不過要在需要編輯的列加上editor:'text' 我這裏只是編輯文本,所以是text,其他時間等類型請查api,
另外因爲我觸發修改的方式是直接點擊單元格,所以table要加上onClickCell屬性,然後重寫onClickCell方法。

$("#remark_dg").datagrid({
            url:'',
            columns:[[ 
                {field:'cb',checkbox:true,align:'center'},
                {field:'id',title:'編號',width:80,hidden:true},
                {field:'text',title:'內容',width:80,editor:'text'}
            ]],
            toolbar:'#remark_tb',  //表格菜單
            fit:true,
            fitColumns:true,
            loadMsg:'加載中...', //加載提示
            rownumbers:true, //顯示行號列
            singleSelect:true,//是允許選擇一行
            onClickCell: onClickCell,
            queryParams:{   //在請求數據是發送的額外參數,如果沒有則不用寫
            },
            onLoadSuccess:function(data){
            },
            rowStyler:function(index,row){
            }
        });

簡單說明下可編輯的實現方法:
首先通過beginEdit讓選中的行啓動編輯,保存的時候,獲得選中的行,通過row取到編輯的信息,使用ajax提交,提交完成,使用endEdit屬性結束行編輯。

 //可編輯行
    var editIndex = undefined;
    function endEditing(){
        if (editIndex == undefined){return true}
        if ($('#remark_dg').datagrid('validateRow', editIndex)){
            $('#remark_dg').datagrid('endEdit', editIndex);
            editIndex = undefined;
            return true;
        } else {
            return false;
        }
    }
    function onClickCell(index, field){
        if (editIndex != index){
            if (endEditing()){
                $('#remark_dg').datagrid('selectRow', index)
                        .datagrid('beginEdit', index);
                var ed = $('#remark_dg').datagrid('getEditor', {index:index,field:field});
                ($(ed.target).data('textbox') ? $(ed.target).textbox('textbox') : $(ed.target)).focus();
                editIndex = index;
            } else {
                $('#remark_dg').datagrid('selectRow', editIndex);
            }
        }
    }
    function accept(){
        if (endEditing()){
            var row = $('#remark_dg').datagrid('getSelected');
            var text = row.text;
            var remarkid = row.id;
            var typeid = $("#typeid").val();
            $.ajax({
                url:"${ctx}/typeRemark/addTypeRemark.do",
                type:"post",
                dataType:"json",
                data:{
                    remarkid:remarkid,
                    text:text,
                    typeid:typeid
                },
                success:function(data){
                    if(data.status == "success"){
                        $.messager.show({
                            title : '提示',
                            msg : '操作成功'
                        });
                        $('#dg').datagrid('load', {});
                    }else{
                        $.messager.show({
                            title : '提示',
                            msg : '操作失敗,請聯繫管理員 ------'
                        });
                    }
                },
                error:function(){
                        $.messager.show({
                            title : '提示',
                            msg : '系統錯誤,請聯繫管理員------'
                        });
                }
            });
        }
    }
    function addRemark(){
         function addRemark(){
        if (editIndex != undefined){
            return ;
        }
        $('#remark_dg').datagrid('insertRow',{
            index: 1,   // 索引從0開始
            row: {
                text:''
            }
        });
        $('#remark_dg').datagrid('selectRow', 1);
        $('#remark_dg').datagrid('beginEdit', 1);
        var ed = $('#remark_dg').datagrid('getEditor', {index:1,field:'text'});
        $(ed.target).focus();
        editIndex = 1;
    }
    }

這裏有必要提一下,我的添加和修改方法用了一個方法accpet(),同時後臺也用一個方法處理的,有需要的可以借鑑一下:
表現層用的是spring mvc,持久成用的hibernate:

@RequestMapping(value = "/addTypeRemark.do",method = RequestMethod.POST)
    @ResponseBody
    public Map<String,String> addTypeRemark(String text,String typeid,@RequestParam(value = "remarkid", required = false)Integer remarkid,HttpServletRequest request){
        Map<String,String>  map = new HashMap<String,String> ();
        System.out.println(typeid);
        try {
            BatchType batchType=batchTypeMag.find(Integer.parseInt(typeid));
            TypeRemark typeRemark = new TypeRemark();
            if(remarkid!=null){
                typeRemark = typeRemarkMag.find(remarkid);
            }
            typeRemark.setBatchType(batchType);
            typeRemark.setText(text);
            typeRemarkMag.saveOrUpdate(typeRemark);
            map.put("status","success");
        } catch (Exception e) {
            e.printStackTrace();
            map.put("status","fail");
        }
        return map;
    }

也就是說,添加的時候,沒有這條記錄的id,修改的時候需要通過記錄的id修改,所以可以判斷一下。

這樣,easyui動態編輯行就完成啦

========================================================================================================

分割線
========================================================================================================
上次寫的這個行編輯還是有點問題的,就是沒有驗證,而且添加的時候沒有獲取到焦點。所以這裏修改一下:
1.editor類型改爲textbox,因爲text不支持easyui的驗證

columns:[[ 
                {field:'id',title:'編號',width:80,hidden:true},
                {field:'text',title:'內容',width:80,editor:{
                    type:'textbox',
                    options:{
                        required:true,
                        validType:'length[0,30]', 
                        invalidMessage:'不能超過30個字!'
                    }
                }}
            ]],

2.添加獲取焦點:

function addRemark(){
        if (editIndex != undefined){
            return ;
        }
        $('#remark_dg').datagrid('insertRow',{
            index: 0,   // 索引從0開始
            row: {
                text:''
            }
        });
        $('#remark_dg').datagrid('selectRow', 0);
        $('#remark_dg').datagrid('beginEdit', 0);
        var ed = $('#remark_dg').datagrid('getEditor', {index:0,field:'text'});
        $(ed.target).textbox('textbox').focus(); 
        editIndex = 0;
    }

3.添加撤銷操作:

function reject(){
            $('#remark_dg').datagrid('rejectChanges');
            editIndex = undefined;
    }
<a href="javascript:reject()" class="easyui-linkbutton" data-options="iconCls:'icon-undo',plain:true" >取消</a>
發佈了160 篇原創文章 · 獲贊 234 · 訪問量 59萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章