Posted on 2009-05-30 00:44
canonical 閱讀(2713)
評論(2) 編輯 收藏 所屬分類:
Witrix開發(fā)平臺
html最早的設(shè)計目標(biāo)只是作為某種多媒體文檔展現(xiàn)技術(shù),其設(shè)計者顯然無法預(yù)料到今天Web應(yīng)用的蓬勃發(fā)展,一些設(shè)計缺陷也就難以避免。特別是html規(guī)范中缺乏對于復(fù)雜交互式組件模型的支持,直接導(dǎo)致企業(yè)應(yīng)用的前臺開發(fā)困難重重。AJAX技術(shù)可以看作是對這種困境的一種改良性響應(yīng),它試圖通過javascript語言在應(yīng)用層創(chuàng)建并維護一系列復(fù)雜的交互機制。很多完善的ajax框架走得相當(dāng)遙遠(yuǎn),最終基本將html作為一種底層“匯編”語言來使用。例如,一個很整齊美觀的類Excel表格可能是由一個個div拼接而成,與html原生的table元素已經(jīng)沒有任何關(guān)系。
Witrix平臺中對于前臺html模型也作了一定的增強,但基本的設(shè)計思想是盡量利用原生控件,并盡量保持原生控件內(nèi)在的數(shù)據(jù)關(guān)系,而不是重新構(gòu)建一個完整的底層支撐環(huán)境。采用這種設(shè)計的原因大致有如下幾點:
1. 前臺技術(shù)目前競爭非常激烈,我們優(yōu)先選擇的方式是集成第三方組件,盡量保持原生環(huán)境有利于降低集成成本。
2. 通過javascript構(gòu)造的控件可能存在性能瓶頸和其他瀏覽器內(nèi)在的限制。例如一般Ajax框架提供的Grid控件都無法支撐大量單元格的顯示。
3. Witrix平臺的tpl模板技術(shù)可以非常方便的生成html文本,并提供強大的控件抽象能力,因此在前臺動態(tài)創(chuàng)建并組織界面元素在Witrix平臺中是一種不經(jīng)濟的做法。
4. Witrix平臺提供的分解機制非常細(xì)致,存儲于不同地方的不同來源的代碼會在不同的時刻織入到最終的頁面中,基于原生環(huán)境有利于降低平臺快速演進過程中的設(shè)計風(fēng)險。
Witrix平臺中對于html模型的增強主要關(guān)注于以最少的代碼實現(xiàn)界面控件與業(yè)務(wù)邏輯的自然結(jié)合。基本結(jié)構(gòu)包括:
1. 通過ControlManager對象在前臺建立一種container結(jié)構(gòu),統(tǒng)一管理控件的注冊和獲取。js.makeControl(elmOrId)返回特殊注冊的控件對象或者根據(jù)原生html元素生成一個包裝對象。
2. 通過js.getWxValue(elm)和js.setWxValue(elm,value)這兩個函數(shù)統(tǒng)一對控件的值的存取過程。
3. 通過js.regListener(elm,listenerFunc)統(tǒng)一管理控件之間的相關(guān)觸發(fā),實現(xiàn)控件之間的相互監(jiān)聽。當(dāng)js.setWxValue(elm,value)被調(diào)用時,注冊在ControlManager中的listenerFunc將被調(diào)用。
4. stdPage.setFieldValue(fieldName,value)和stdPage.getFieldValue(fieldName,value)統(tǒng)一針對業(yè)務(wù)字段的值的存取過程,這里fieldName對應(yīng)于實體上的業(yè)務(wù)字段名。
5. 通過ajax.addForm(frmId)等函數(shù)統(tǒng)一前臺提交參數(shù)的提取過程,通過stdPage.buildAjax()等函數(shù)統(tǒng)一后臺服務(wù)的調(diào)用方式。
6. 通過stdPage對象統(tǒng)一封裝業(yè)務(wù)場景中的"常識"。
基于以上一些基礎(chǔ)機制,Witrix平臺即可提供一些復(fù)雜的業(yè)務(wù)組件封裝。例如<input name="productCode" onkeypress="stdPage.keyPressToLoadRefByCode({objectName:'SomeProduct',queryField:'productCode'})" .../>通過簡單的調(diào)用一個js函數(shù)即可實現(xiàn)如下功能:
a. 在文本框中輸入回車的時候自動提交到后臺查找對應(yīng)產(chǎn)品代碼的產(chǎn)品,并更新前臺多個相關(guān)字段的值
b. 如果沒有查找到相應(yīng)產(chǎn)品,則彈出對話框根據(jù)界面上已有的部分字段信息提示客戶添加新的產(chǎn)品信息。
c. 如果找到多個對應(yīng)產(chǎn)品,則彈出列表允許客戶選擇其一。
d. 具體的處理過程可以通過函數(shù)參數(shù)進行精細(xì)的控制。
在meta文件中,結(jié)合上下文環(huán)境中的元數(shù)據(jù)信息,我們在缺省情況下可以直接使用 <ds:LoadRefByCodeInputor objectName="SomeProduct" />標(biāo)簽,不需要任何其他附加參數(shù)。
Witrix平臺中一般利用原生控件來保存數(shù)據(jù)值,而不是將數(shù)據(jù)保存在分離的js對象中。例如對于一個選擇控件,經(jīng)常要求選擇得到的是實體的id,而顯示在界面上的是某個其他字段的值。Witrix平臺中一般的實現(xiàn)結(jié)構(gòu)是
<input type="hidden" name="${fieldName}" value="${entity[dsMeta.idField]}" id="${id}" textId="text_${id}" />
<input type="text" value="${entity[dsMeta.nameField]}" id="text_${id}" />
通過textId等擴展屬性即可明確定義控件多個部分之間的關(guān)聯(lián)關(guān)系,同時保證控件的實現(xiàn)完全與html規(guī)范相兼容。
Witrix平臺中目前使用的"標(biāo)準(zhǔn)化"的擴展屬性有textId(對應(yīng)文本顯示控件的id), showName(某些無文字顯示的選擇控件需要保留顯示字段值), op(字段作為查詢條件提交時的比較算符),validator(字段值對應(yīng)的檢驗函數(shù)),setWxValue/getWxValue(重定義控件值的存取行為),serializer(特殊處理前臺控件的提交參數(shù))等。擴展屬性不僅可以引入說明信息,還可以引入豐富的控件行為。