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.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);
easyui plugin——etreegrid:CRUD Treegrid的更多相关文章
- easyui plugin —— etreegrid:CRUD Treegrid
昨天写了一个ko+easyui的同样的实现,感觉写的太乱,用起来十分麻烦,于是今天照着edatagrid,写了一个etreegrid,这样再用ko绑定就方便多了. 使用很简单,$(tableId).e ...
- jquery easyui教程[申明:来源于网络]
jquery easyui教程[申明:来源于网络] 地址:http://wenku.baidu.com/view/570e4d4533687e21af45a941.html
- 网页中的数据的4个处理方式:CRUD(Creat, Retrive, Update, Delete)
网页中的数据的4个处理方式:CRUD(Creat, Retrive, Update, Delete) 2018-12-21, 后续完善
- 疑似easyui本身bug:easyui时间控件问题,试了几个版本都不行
最近发现easyui时间控件的值格式不支持带斜杠的日期(2016/10/31),必须是2016-10-31这类的才能正常使用,否则默认初始化为当前时间 <input id="Retur ...
- 【jQuery EasyUI系列】创建CRUD数据网格
在上一篇中我们使用对话框组件创建了CRUD应用创建和编辑用户信息.本篇我们来创建一个CRUD数据网格DataGrid 步骤1,在HTML标签中定义数据网格(DataGrid) <table id ...
- 学习 easyui 之二:jQuery 的 ready 函数和 easyloader 的加载回调函数
Ready 事件不一定 ready 使用 easyloader 的时候,必须要注意到脚本的加载时机问题,easyloader 会异步加载模块,所以,你使用的模块不一定已经加载了.比如下面的代码. &l ...
- struts2 easyui实现datagrid的crud
最近两天因为项目需要,接触了easyui,要用它的datagrid实现crud.第一次做,花了一天时间才完成所有功能,昨天做另外一个模块,同样的功能只用了两个小时. 现在把第一次做datagrid时遇 ...
- REST构架风格介绍之二:CRUD
转载自:Todd Wei http://www.cnblogs.com/weidagang2046/archive/2009/05/09/1453065.html 上一节我们通过两个例子初步体 ...
- EasyUI 让dialog中的treegrid的列头固定
先上效果: 最主要是在treegrid要加上"fit:true "如果不加那么就会用diglog的滚动条,导致treegrid的头就没办法固定. Code<div id=&q ...
随机推荐
- 《JavaScript高级程序设计》学习笔记12篇
写在前面: 这12篇博文不是给人看的,而是用来查的,忘记了什么基础知识,点开页面Ctrl + F关键字就好了 P.S.如果在对应分类里没有找到,麻烦告诉我,以便尽快添上.当然,我也会时不时地添点遗漏的 ...
- 体验应用程序在Mac/iPhone/iPad之间的Handoff
对于苹果新推出的Handoff功能,之前只体验了接电话的Handoff.一个电话打过来,iPhone/iPad/Mac同时响起,这时如果手上拿着东西在吃,就可以直接在Mac上接电话. 除此之外,还可以 ...
- C语言 线性表 双向链式结构 实现
一个双向链式结构实现的线性表 duList (GCC编译). /** * @brief 线性表双向链表结构 * @author wid * @date 2013-10-28 * * @note 若代码 ...
- [翻译]Bob大叔:反思极限编程
译者注: Bob大叔14年后再次谈论极限编程.极限编程经历了14年的风风雨雨后,Bob大叔将会给它怎么样的定义那? 在我手中拿着的一本白皮薄书,在14年前彻底的改变了软件世界.这本书的标题是解析极限编 ...
- 编码剖析Spring管理bean的原理
project目录 MyClassPathXMLApplicationContext读取xml,以及实例化bean. 因为是一开始实例化配置文件所有bean,所以需要构造器完成这些工作. packag ...
- 用distinct在MySQL中查询多条不重复记录值[转]
在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所 ...
- paip.c3p0 数据库连接池 NullPointerException 的解决...
paip.c3p0 数据库连接池 NullPointerException 的解决... 程序ide里面运行正常..外面bat运行错误.. 作者Attilax 艾龙, EMAIL:14665198 ...
- atitit.hbnt orm db 新新增更新最佳实践o99
atitit.hbnt orm db 新新增更新最佳实践o99 1. merge跟个save了. 1 2. POJO对象处于游离态.持久态.托管态.使用merge()的情况. 1 3. @Dynami ...
- paip.提升效率---request自动绑定domain object
paip.提升效率---request自动绑定domain object #.keyword,subtitle关键字,子标题 ------------------------- 复制request属性 ...
- java集合练习——题目
2.已知有十六支男子足球队参加2008 北京奥运会.写一个程序,把这16 支球队随机分为4 个组.采用List集合和随机数 2008 北京奥运会男足参赛国家: 科特迪瓦,阿根廷,澳大利亚,塞尔维亚,荷 ...