當(dāng)你需要通過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是一個(gè)字符串通過 $函數(shù)轉(zhuǎn)化一下,$函數(shù)的使用見我的上個(gè)帖子深入分析dwr中的DWRUtil.$? if (typeof data == "string") ele = $(data);
//如果ele是個(gè)HTML元素對象,通常應(yīng)該是一個(gè)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;
??? }
???
//定義一個(gè)空對象reply??? var reply = {};
??? //定義一個(gè)對象放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;
? }
//如果傳入的參數(shù)對象不是表單對象,通常應(yīng)該是與領(lǐng)域?qū)ο髮?yīng)js對象? else {
???
//遍歷對象屬性,將與屬性對應(yīng)的頁面元素值拷到j(luò)s對象中??? 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;
? }
};
總結(jié)1)如果你需要使用ajax完成表單提交的操作,那么你應(yīng)該使用DWRUtil.getValues,參數(shù)或者是個(gè)form對象,或者是個(gè)與領(lǐng)域?qū)ο髮?yīng)的js對象2)應(yīng)該看到第二種用法的局限性,如果存在多個(gè)相同的表單或者是個(gè)復(fù)合的js對象,那么第二種用法是不合適的3)第一種用法看似復(fù)雜,但更具靈活性到底改如何選擇取決于具體的應(yīng)用====================================================
?背景:需要使用ajax完成表單提交操作
核心代碼如下:
??? function addReply(frm){
?
?
。。。。
?
//利用dwr自動(dòng)將frm提交的數(shù)據(jù)植入js對象,
//DWRUtil.getValues的使用見我的上篇帖子
var commentForm = DWRUtil.getValues(frm);
?
//調(diào)用服務(wù)器端的服務(wù)
CommentService.writeComment(writecallback,commentForm );
。。。。。
}
?
注意以下幾點(diǎn)
1)傳給服務(wù)的js對象最好嚴(yán)格與領(lǐng)域?qū)ο髮?yīng)不能有key為""的屬性否則會(huì)報(bào)錯(cuò),可以有多余? 的屬性,但后臺(tái)會(huì)出現(xiàn)一些煩人日志信息告訴你無法匹配
2)對于領(lǐng)域?qū)ο髞碚f,dwr在轉(zhuǎn)換時(shí)會(huì)遍歷所有g(shù)et方法(根據(jù)傳入的js對象屬性進(jìn)行反射不就好了,為什么要遍歷get方法,真是奇怪啊),所以注意你的get方法要健壯避免后臺(tái)會(huì)出很多日志信息匯報(bào)空指針之類的錯(cuò)誤
3)關(guān)于本地傳遞的js對象,必須結(jié)構(gòu)與領(lǐng)域?qū)ο髮?yīng)。從抽象的角度看多數(shù)情況領(lǐng)域?qū)ο笸?? 全可以用數(shù)組和hash結(jié)構(gòu)描述,何況所謂的對應(yīng)只是屬性的對應(yīng),所以合理的使用Array和Object完全可以實(shí)現(xiàn)js對象和領(lǐng)域?qū)ο蟮钠ヅ?br />
?
4)必須配置合適的轉(zhuǎn)化器讓dwr知道如何將你傳入的js對象轉(zhuǎn)化為領(lǐng)域?qū)ο?/span>
?
5)使用DWRUtil.getValues(frm)或者DWRUtil.getValues(obj)收集提交的數(shù)據(jù)
?? 方式的區(qū)別詳見該文上半部分
posted on 2006-11-21 22:38
有貓相伴的日子 閱讀(1721)
評論(0) 編輯 收藏 所屬分類:
dwr