当你需要通过dwr完成类似提交form的操作,了解DWRUtil.getValues是必须的
/** * Given a map, call getValue() for all the entries in the map using the entry key as an element id. * Given a string or element that refers to a form, create an object from the elements of the form. * @see http://getahead.ltd.uk/dwr/browser/util/getvalues */ DWRUtil.getValues = function(data) { //定义ele变量, var ele; //如果ele是一个字符串通过 $函数转化一下,$函数的使用见我的上个帖子深入分析dwr中的DWRUtil.$ if (typeof data == "string") ele = $(data); //如果ele是个HTML元素对象,通常应该是一个form对象 if (DWRUtil._isHTMLElement(data)) ele = data; if (ele != null) { //如果ele不是form对象,返回,只有form对象才有elements 属性 if (ele.elements == null) { alert("getValues() requires an object or reference to a form element."); return null; } //定义一个空对象reply var reply = {}; //定义一个对象放key var value; //遍历form,将表单key-value放入reply,忽略<input type="image"/> for (var i = 0; i < ele.elements.length; i++) { if (ele[i].id != null) value = ele[i].id; else if (ele[i].value != null) value = ele[i].value; else value = "element" + i; reply[value] = DWRUtil.getValue(ele[i]); } return reply; } //如果传入的参数对象不是表单对象,通常应该是与领域对象对应js对象 else { //遍历对象属性,将与属性对应的页面元素值拷到js对象中 for (var property in data) { // Are there any elements with that id or name if ($(property) != null || document.getElementsByName(property).length >= 1) { data[property] = DWRUtil.getValue(property); } } return data; } };
总结
1)如果你需要使用ajax完成表单提交的操作,那么你应该使用DWRUtil.getValues,参数或者是个form对象,或者是个与领域对象对应的js对象
2)应该看到第二种用法的局限性,如果存在多个相同的表单或者是个复合的js对象,那么第二种用法是不合适的
3)第一种用法看似复杂,但更具灵活性
到底改如何选择取决于具体的应用
====================================================
背景:需要使用ajax完成表单提交操作
核心代码如下:
function addReply(frm){ //利用dwr自动将frm提交的数据植入js对象, //DWRUtil.getValues的使用见我的上篇帖子 var commentForm = DWRUtil.getValues(frm); //调用服务器端的服务 CommentService.writeComment(writecallback,commentForm ); //.... }
注意以下几点
1 )传给服务的 js 对象最好严格与领域对象对应不能有key为""的属性否则会报错,可以有多余 的属性,但后台会出现一些烦人日志信息告诉你无法匹配
2)对于领域对象来说,dwr在转换时会遍历所有get方法(根据传入的js对象属性进行反射不就好了, 为什么要遍历get方法,真是奇怪啊 ),所以注意你的get方法要健壮避免后台会出很多日志信息汇报空指针之类的错误
3)关于本地传递的js对象,必须结构与领域对象对应。从抽象的角度看多数情况领域对象完 全可以用数组和hash结构描述,何况所谓的对应只是属性的对应,所以合理的使用Array和Object完全可以实现js对象和领域对象的匹配
4 )必须配置合适的转化器 让 dwr 知道如何将你传入的 js 对象转化为领域对象
5 )使用DWRUtil.getValues(frm)或者DWRUtil.getValues( obj )收集提交的数据