昨天写了一个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.editId >= 0) { if (!trySaveRow()) { focusEditor(field); return; } } }, onAfterEdit: function (row, changes) { //opts.editId = undefined; var url = row.isNewRecord ? opts.saveUrl : opts.updateUrl || opts.saveUrl; if (url) { $.post(url, row).done(function (json, statusText, xhr) { if (opts.editId === 0) { json = eval("(" + json + ")");//注意这个地方,接口返回的数据的格式,可以根据自己的情况修改 $(target).treegrid("remove", opts.editId); var data = json.data; //console.log(data); $(target).treegrid("append", { parent: data[opts.parentIdField], data: [data] }); } else { //refresh $(target).treegrid("refresh", row[opts.idField]); } opts.editId = undefined; }).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.editId = 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.editId)) { $(target).treegrid("select", opts.editId); return false; } if (opts.onBeforeSave.call(this, opts.editId) == false) { setTimeout(function () { $(target).treegrid('select', opts.editId); }, 0); return false; } $(target).treegrid('endEdit', opts.editId); return true; } function focusEditor(field) { var editor = $(target).treegrid('getEditor', { id: opts.editId, field: field }); if (editor) { editor.target.focus(); } else { var editors = $(target).treegrid('getEditors', opts.editId); 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 rowId = row[opts.idField]; var editId = opts.editId; if (editId != rowId) { if (dg.treegrid("validateRow", editId)) { if (editId >= 0) { if (opts.onBeforeSave.call(this, editId) == false) { setTimeout(function () { dg.treegrid("select", editId); }, 0); return; } } dg.treegrid("endEdit", editId); dg.treegrid("beginEdit", rowId); opts.editId = rowId; var node = dg.treegrid("find", rowId); opts.onEdit.call(this, node); } else { setTimeout(function () { dg.treegrid("select", editId); }, 0); } } }); }, addRow: function (jq) { return jq.each(function () { var dg = $(this); var opts = $.data(this, "etreegrid").options; var editId = opts.editId; if (opts.editId >= 0) { if (!dg.treegrid("validateRow", editId)) { dg.treegrid("select", editId); return; } if (opts.onBeforeSave.call(this, opts.editId) == false) { setTimeout(function () { dg.treegrid('select', opts.editId); }, 0); return; } dg.treegrid('endEdit', opts.editId); } else { var selected = dg.treegrid("getSelected"); var parentId = selected ? selected[opts.idField] : 0; var newRecord = {}; newRecord[opts.idField] = 0; newRecord[opts.parentIdField] = parentId; console.log(newRecord) dg.treegrid("append", { parent: parentId, data: [newRecord] }); if (parentId > 0) { var children = dg.treegrid("getChildren"); } opts.editId = 0; dg.treegrid("beginEdit", opts.editId); dg.treegrid("select", opts.editId); } }); }, saveRow: function (jq) { return jq.each(function () { var dg = $(this); var opts = $.data(this, 'etreegrid').options; if (opts.editId >= 0) { if (!dg.treegrid("validateRow", opts.editId)) { dg.treegrid("select", opts.editId); return; } if (opts.onBeforeSave.call(this, opts.editId) == false) { setTimeout(function () { dg.treegrid('select', opts.editId); }, 0); return; } $(this).treegrid('endEdit', opts.editId); } }); }, cancelRow: function (jq) { return jq.each(function () { var rowId = $(this).etreegrid('options').editId; $(this).treegrid('cancelEdit', rowId); }); }, 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, editId: undefined, 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);