在公司的项目中用到了EC/ET,后来说要重新移植一下该项目,于是在本人的鼓动下,决定使用jmesa来替代,由于jmesa的前身就是EC,所以用法也比较相似,再加上之前也花过一些时间用了一下,因此自己还是比较有信心的。但经过这一个多月的深入接触,发现jmesa还有许多地方需要改进,由于官方好像也只有一个人维护(而且也不积极),所以也不能指望官方来修护了。于是不得不花些时间去看看它的源码,还一些不满意的地方进行修改。总体来说,jmesa功能还是比较强大的,要玩得转它,就相当于学习一种新框架,由于问题比较多,时间也有限,因此先暂时写一下在jmesa中增加“删除”的功能。由于jmesa本身并没有提供删除的功能,于是需要手动的操作来完成,显示部分的代码如下:
<jmesa:htmlColumn title="操作" editable="false" filterable="false" sortable="false">
<a href="javascript:void(0);" onclick="deleteUser('user_table1','${bean.id}');">删除</a></jmesa:htmlColumn>
之所以要这么做而不是直接用URL来实现删除,是因为删除时应当保留当前的页数,如在第二页删除了一条记录,那么删除以后也应该回到第二页才对,要实现此功能,需要用到jmesa的分页功能,而这些参数的获取及赋值也需通过JS来实现,因此这样做似乎更合理一些。在JS部分,可以这样:
<script type="text/javascript">
function onInvokeAction(id) {
$.jmesa.setExportToLimit(id, '');
$.jmesa.createHiddenInputFieldsForLimitAndSubmit(id);
}
function onInvokeExportAction(id) {
var parameterString = $.jmesa.createParameterStringForLimit(id);
location.href = '${pageContext.request.contextPath}/user/user.mvc?method=showUsers&id=user_table2&' + parameterString;
}
function deleteUser(tableid,id){
deleteWithLimitInfoForJSP("${pageContext.request.contextPath}/user/user.mvc",tableid,id);
}
</script>
上面就加了一个deleteUser方法,然后在相应的jmesa.js加入以下代码:
function createParameterStringForLimit(id) {
return jQuery.jmesa.createParameterStringForLimit(id);
}
function deleteWithLimitInfoForJSP(deleteurl,tableid,id){
var currentpage=jQuery.jmesa.getLimitPage(tableid);
jQuery.jmesa.setPageToLimit(tableid,currentpage);
jQuery.ajax({
type: "get",
url: deleteurl,
data: "method=ajaxDelete&id="+id,
success: function(msg) {
alert("删除成功!");
createHiddenInputFieldsForLimitAndSubmit(tableid);
}
});
}
/*********** Filter ***********/
....
即添加了deleteWithLimitInfoForJSP方法,通过其前后的代码,也能知道该段代码该放在什么地方,此代码就是执行删除操作的代码,通过调用jquery的AJAX操作来实现,然后调用控制器的ajaxaDelete方法实现删除,这个方法还用到了一个getLimitPage方法,这个方法的代码放在jquery.jmesa.js中:
onInvokeExportAction : function (id) {
var tableFacade = this.getTableFacade(id);
var f = window[tableFacade.onInvokeExportAction];
if ($.isFunction(f) !== true) {
throw tableFacade.onInvokeExportAction + ' is not a global function!';
} else {
f(id);
}
},
getLimitPage : function(tableid,id) {
var limit = this.getTableFacade(tableid).limit;
return limit.page;
}
};
/*********** Objects and Prototype Functions ***********/
.
之所以把前后的代码放出来,是为了确定其放的位置,这些代码其实是参照了网上的实现,只是那篇博客讲得并不完整,所以故重新把它整理写了下来,这样一个基本的删除操作就算完成了。
关于jmesa的问题还有很多,以后有空再把其它的写下来。