zoukankan      html  css  js  c++  java
  • easyui plugin —— etreegrid:CRUD Treegrid

        昨天写了一个ko+easyui的同样的实现,感觉写的太乱,用起来十分麻烦,于是今天照着edatagrid,写了一个etreegrid,这样再用ko绑定就方便多了。 使用很简单,$(tableId).etreegrid({idField:''parentIdField:'',treeField:'',saveUrl:'',deleteUrl:''}); 还支持一些事件,onSave,onBeforeSave,onEdit,onAdd,onRemove; Url可以不指定,指定Data即可。

    /** 
     * etreegrid - jQuery EasyUI 
     *  
     * Licensed under the GPL: 
     *   http://www.gnu.org/licenses/gpl.txt 
     * 
     * Copyright 2013 maddemon [ zhengliangjun@gmail.com ]  
     *  
     * Dependencies: 
     *   treegrid 
     *   messager 
     *  
     */  
    (function ($) {  
      
        function buildGrid(target) {  
            var opts = $.data(target, 'etreegrid').options;  
            $(target).treegrid($.extend({}, opts, {  
                onDblClickCell: function (field, row) {  
                    if (opts.editing) {  
                        $(this).etreegrid("editRow", row);  
                        focusEditor(field);  
                    }  
                },  
                onClickCell: function (field, row) {  
                    if (opts.editing && opts.editIndex >= 0) {  
                        if (!trySaveRow()) {  
                            focusEditor(field);  
                            return;  
                        }  
                    }  
                },  
                onAfterEdit: function (row, changes) {  
                    opts.editIndex = undefined;  
                    var url = row.isNewRecord ? opts.saveUrl : opts.updateUrl;  
                    if (url) {  
                        $.post(url, row).done(function (json, statusText, xhr) {  
                            if (row.isNewRecord) {  
                                row.isNewRecord = false;  
                                //remove new  
                                $(target).treegrid("remove", row[opts.idField]);  
                                row[opts.idField] = json[opts.idField] || json.data[opts.idField];  
                                $(target).treegrid("append", { parent: row[opts.parentIdField], data: [row] });  
                                //append new  
                            } else {  
                                //refresh  
                                $(target).treegrid("refresh", row[opts.idField]);  
                            }  
                        }).error(function (xhr) {  
                            var result = eval("(" + xhr.responseText + ")");  
                            $.messager.alert("失败", result.message || result, "warning");  
                        });  
                        opts.onSave.call(target, row);  
                    } else {  
                        opts.onSave.call(target, row);  
                    }  
                    if (opts.onAfterEdit) opts.onAfterEdit.call(target, row);  
                },  
                onCancelEdit: function (row) {  
                    opts.editIndex = undefined;  
                    if (row.isNewRecord) {  
                        $(this).treegrid("remove", row[opts.idField]);  
                    }  
                    if (opts.onCancelEdit) opts.onCancelEdit.call(target, row);  
                },  
                onBeforeLoad: function (row, param) {  
                    if (opts.onBeforeLoad.call(target, row, param) == false) {  
                        return false;  
                    };  
                    $(this).treegrid("rejectChanges");  
                }  
            }));  
      
            function trySaveRow() {  
                if (!$(target).treegrid("validateRow", opts.editIndex)) {  
                    $(target).treegrid("select", opts.editIndex);  
                    return false;  
                }  
                if (opts.onBeforeSave.call(this, opts.editIndex) == false) {  
                    setTimeout(function () {  
                        $(target).treegrid('select', opts.editIndex);  
                    }, 0);  
                    return false;  
                }  
                $(target).treegrid('endEdit', opts.editIndex);  
                return true;  
            }  
      
            function focusEditor(field) {  
                var editor = $(target).treegrid('getEditor', { index: opts.editIndex, field: field });  
                if (editor) {  
                    editor.target.focus();  
                } else {  
                    var editors = $(target).treegrid('getEditors', opts.editIndex);  
                    if (editors.length) {  
                        editors[0].target.focus();  
                    }  
                }  
            }  
        }  
      
        $.fn.etreegrid = function (options, param) {  
            if (typeof (options) == "string") {  
                var method = $.fn.etreegrid.methods[options];  
                if (method) {  
                    return method(this, param);  
                } else {  
                    return this.treegrid(options, param);  
                }  
            }  
      
            options = options || {};  
            return this.each(function () {  
                var state = $.data(this, "etreegrid");  
                if (state) {  
                    $.extend(state.options, options);  
                } else {  
                    $.data(this, "etreegrid", { options: $.extend({}, $.fn.etreegrid.defaults, $.fn.etreegrid.parseOptions(this), options) });  
                }  
                ;  
                buildGrid(this);  
      
            });  
        };  
      
        $.fn.etreegrid.parseOptions = function (target) {  
            return $.extend({}, $.fn.treegrid.parseOptions(target), {});  
        };  
      
        $.fn.etreegrid.methods = {  
            options: function (jq) {  
                var opts = $.data(jq[0], "etreegrid").options;  
                return opts;  
            },  
            enableEditing: function (jq) {  
                return jq.each(function () {  
                    var opts = $.data(this, "etreegrid").options;  
                    opts.editing = true;  
                });  
            },  
            disableEditing: function (jq) {  
                return jq.each(function () {  
                    var opts = $.data(this, "etreegrid").options;  
                    opts.editing = false;  
                });  
            },  
            editRow: function (jq, row) {  
                return jq.each(function () {  
                    var dg = $(this);  
                    var opts = $.data(this, "etreegrid").options;  
                    var index = row[opts.idField];  
                    var editIndex = opts.editIndex;  
                    if (editIndex != index) {  
                        if (dg.treegrid("validateRow", editIndex)) {  
                            if (editIndex >= 0) {  
                                if (opts.onBeforeSave.call(this, editIndex) == false) {  
                                    setTimeout(function () {  
                                        dg.treegrid("select", editIndex);  
                                    }, 0);  
                                    return;  
                                }  
                            }  
                            dg.treegrid("endEdit", editIndex);  
                            dg.treegrid("beginEdit", index);  
                            opts.editIndex = index;  
                            var node = dg.treegrid("find", index);  
                            opts.onEdit.call(this, node);  
                        } else {  
                            setTimeout(function () {  
                                dg.treegrid("select", editIndex);  
                            }, 0);  
                        }  
                    }  
                });  
            },  
            addRow: function (jq) {  
                return jq.each(function () {  
                    var dg = $(this);  
                    var opts = $.data(this, "etreegrid").options;  
                    var editIndex = opts.editIndex;  
                    if (opts.editIndex >= 0) {  
                        if (!dg.treegrid("validateRow", editIndex)) {  
                            dg.treegrid("select", editIndex);  
                            return;  
                        }  
                        if (opts.onBeforeSave.call(this, opts.editIndex) == false) {  
                            setTimeout(function () {  
                                dg.treegrid('select', opts.editIndex);  
                            }, 0);  
                            return;  
                        }  
                        dg.treegrid('endEdit', opts.editIndex);  
                    }  
                    var selected = dg.treegrid("getSelected");  
                    var parentId = selected ? selected[opts.idField] : 0;  
                    var newRecord = { isNewRecord: true };  
                    newRecord[opts.idField] = 0;  
                    newRecord[opts.parentIdField] = parentId;  
                    dg.treegrid("append", { parent: parentId, data: [newRecord] });  
                    opts.editIndex = 0;  
                    dg.treegrid("beginEdit", opts.editIndex);  
                    dg.treegrid("select", opts.editIndex);  
                });  
            },  
            saveRow: function (jq) {  
                return jq.each(function () {  
                    var dg = $(this);  
                    var opts = $.data(this, 'etreegrid').options;  
                    if (opts.editIndex >= 0) {  
                        if (!dg.treegrid("validateRow", opts.editIndex)) {  
                            dg.treegrid("select", opts.editIndex);  
                            return;  
                        }  
                        if (opts.onBeforeSave.call(this, opts.editIndex) == false) {  
                            setTimeout(function () {  
                                dg.treegrid('select', opts.editIndex);  
                            }, 0);  
                            return;  
                        }  
                        $(this).treegrid('endEdit', opts.editIndex);  
                    }  
                });  
            },  
            cancelRow: function (jq) {  
                return jq.each(function () {  
                    var index = $(this).etreegrid('options').editIndex;  
                    $(this).treegrid('cancelEdit', index);  
                });  
            },  
            removeRow: function (jq) {  
                return jq.each(function () {  
                    var dg = $(this);  
                    var opts = $.data(this, 'etreegrid').options;  
                    var row = dg.treegrid('getSelected');  
                    if (!row) return;  
                    if (row.isNewRecord) {  
                        dg.treegrid("remove", row[opts.idField]);  
                        return;  
                    }  
                    $.messager.confirm("确认", "确认删除这条数据吗?", function (r) {  
                        if (!r) return;  
                        var idValue = row[opts.idField];  
                        if (opts.deleteUrl) {  
                            $.post(opts.deleteUrl, { id: idValue }).done(function (json) {  
                                dg.treegrid("remove", idValue);  
                                opts.onRemove.call(dg[0], json, row);  
                            }).error(function (xhr) {  
                                var json = eval('(' + xhr.responseText + ')');  
                                $.messager.alert('错误', json.message || json, "warning");  
                            });  
                        } else {  
                            dg.datagrid('cancelEdit', idValue);  
                            dg.datagrid('deleteRow', idValue);  
                            opts.onRemove.call(dg[0], row);  
                        }  
                    });  
                });  
            }  
        };  
      
        $.fn.etreegrid.defaults = $.extend({}, $.fn.treegrid.defaults, {  
            editing: true,  
            editIndex: -1,  
            messager: {},  
      
            url: null,  
            saveUrl: null,  
            updateUrl: null,  
            deleteUrl: null,  
      
            onAdd: function (row) { },  
            onEdit: function (row) { },  
            onBeforeSave: function (index) { },  
            onSave: function (row) { },  
            onRemove: function (row) { },  
        });  
    })(jQuery);  

     knockoutjs使用此插件的方法:

    <div id="area-form" fit="true">  
        <div id="area-tool-bar">  
            <a href="javascript:void(0)" class="easyui-linkbutton" iconcls="icon-add" plain="true" data-bind="click: add">新增</a>  
            <a href="javascript:void(0)" class="easyui-linkbutton" iconcls="icon-save" plain="true" data-bind="click: save">保存</a>  
            <a href="javascript:void(0)" class="easyui-linkbutton" iconcls="icon-remove" plain="true" data-bind="click: remove">删除</a>  
            <a href="javascript:void(0)" class="easyui-linkbutton" iconcls="icon-cancel" plain="true" data-bind="click: cancel">取消</a>  
        </div>  
        <table id="area-list" rownumbers="true" title="区域列表" border="0" toolbar="#area-tool-bar" data-bind="etreegrid:tree">  
            <thead>  
                <tr>  
                    <th field="Name" width="500" data-options="editor:{type:'validatebox',options:{required:true}}">地区名称</th>  
                    <th field="Code" width="120" data-options="editor:{type:'validatebox'}">地区编码</th>  
                </tr>  
            </thead>  
        </table>  
    </div>  
    <script type="text/javascript">  
        (function () {  
      
            var listId = "#area-list";  
      
            function AreaModel() {  
                this.tree = {  
                    url: "/area/gettree",  
                    treeField: "Name",  
                    parentIdField: "ParentID",  
                    idField: "ID",  
                    saveUrl: "/area/save",  
                    deleteUrl: "/area/delete",  
                };  
      
                this.add = function() {  
                    $(listId).etreegrid("addRow");  
                };  
                this.save = function () {  
                    $(listId).etreegrid("saveRow");  
                };  
                this.remove = function () {  
                    $(listId).etreegrid("removeRow");  
                };  
                this.cancel = function () {  
                    $(listId).etreegrid("cancelRow");  
                };  
            };  
            ko.applyBindings(new AreaModel(), document.getElementById("area-form"));  
        })();  
    </script>  
  • 相关阅读:
    【简●解】[AHOI2009]中国象棋
    【讲●解】KMP算法
    【简●解】POJ 1185,LG P2704【炮兵阵地】
    学习网站整理
    【讲●解】火车进出栈类问题 & 卡特兰数应用
    洛谷4556 [Vani有约会]雨天的尾巴
    BZOJ2212或洛谷3521 [POI2011]ROT-Tree Rotations
    洛谷1119 灾后重建
    洛谷1462(重题1951) 通往奥格瑞玛的道路(收费站_NOI导刊2009提高(2))
    BZOJ2721或洛谷1445 [Violet]樱花
  • 原文地址:https://www.cnblogs.com/hubing/p/3982303.html
Copyright © 2011-2022 走看看