版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
靈活使用dorado5v1.0
靈活使用dorado5
2007年9月
靈活使用dorado5v1.0
目錄
靈活使用doardo54
前言4
事例一:用于資源分配的DataTable5
情景描述5
典型界面5
數(shù)據(jù)庫準備6
解決思路7
知識點7
使用自定義的數(shù)據(jù)源7
利用keyGenerator屬性為記錄自動分配主鍵9
服務器端動態(tài)為Dataset添加字段。10
重視EventManager的使用13
DataTable的footer的用法14
通過Dataset的beforeChange事件維護業(yè)務約束15
代碼清單15
事例二:模擬多行表頭的DataRble22
情景描述22
典型界面23
數(shù)據(jù)庫準備24
解決思路25
知識點25
服務器端動態(tài)生成Dataset25
VBC:一種面向業(yè)務的客戶端的代碼風格29
客戶端動態(tài)生成DataBble34
使用onRefresh事件控制顯示形式35
利用listDatasets()函數(shù)得到頁面所有的Dataset35
控制Dataset部分記錄可以被編輯36
控制DataBble的部分Cell可以被編輯36
手動修改記錄的狀態(tài)36
UpdateCommand的reduceReturnlnfo屬性37
事例三:具有三種狀態(tài)的靜態(tài)樹38
情景描述38
典型界面39
Dataset結構40
解決思路41
代碼清單41
知識點47
_CONTEXT_PATH常量47
手動為節(jié)點添加子節(jié)點48
利用遞歸方法構造完整的樹48
靈活使用dorado5v1.0
自定義Tree的onRefreshNode事件49
同步父子節(jié)點狀態(tài)同步的算法50
事例四:分組顯示的RadioBox53
情景描述53
典型界面53
數(shù)據(jù)庫準備54
Dataset結構55
解決思路55
代碼清單55
知識點61
引入用戶JavaScript庫62
按照面向對象的思想擴展組件62
組件包裝器63
擴展組件的激活函數(shù)63
客戶端創(chuàng)建菜單64
視圖約束(ViewRules)的入口65
自定義組件的Model層66
自定義組件Model層對外的數(shù)據(jù)接口67
事例五:代碼翻譯69
情景描述69
幾種常見的方案69
方案一:數(shù)據(jù)庫翻譯69
方案二:服務器端翻譯69
方案三:客戶端翻譯69
一種另類的翻譯70
使用步驟70
解決思路72
源代碼72
靈活使用dorado5v1.0
靈活使用doardo5
刖B
《靈活使用dorado5》是面向具有dorado中級開發(fā)能力的群體,即滿足《dorado
學習建議》中3級要求的開發(fā)者。如果您對文中的概念或者API不是非常熟練可以參考
dorado5的其他資料,強烈推薦《dorado5用戶指南》。
Dorado是款結合了RIA/AJAX技術的面向企業(yè)級的交互型應用的展現(xiàn)層中間件。
獨特的Dorado引擎維護了客戶端MVC模型以及客戶端與服務器端的AJAX通信。將數(shù)據(jù)
與展現(xiàn)形式分離的思想導致Dataset數(shù)據(jù)集和Control組件的誕生,從此客戶端的關注
點山展現(xiàn)形式轉移到了對數(shù)據(jù)的控制上,提高了對業(yè)務邏輯的抽象層次,增強了對業(yè)務邏輯
的控制能力,加速了對展現(xiàn)形式變化的響應速度。
Dorad。是按照企業(yè)應用通用場景建模的,幾乎滿足所有的企業(yè)交互型應用的需要。由
于這個建?;A使得我們在很多情況下只要通過配置或者編寫少量的腳本就可以滿足需求。
對于某些特殊業(yè)務可能需要我們編寫一定量的代碼才能滿足,好在我們是站在巨人的肩膀上
思考問題,有了Dorado為我們提供的服務器端與客戶端的完整易用的框架模型,只要稍
加思考通??梢栽诖嘶A上快速找到解決方案。本文檔也是站在這樣的高度向大家展示如何
靈活運用Dorado模型以及按照Dorado的思維來解決非典型的應用需求,文檔重點以思
路分析與代碼展示為主,并且講述了一種叫做VBC的面向業(yè)務的客戶端代碼的編寫風格,
幫助我們保持業(yè)務流程和腳本結構的清晰度。
靈活使用dorado5v1.0
事例一:用于資源分配的DataTable
情景描述
本事例是按照客戶向供應商購買服務包的應用場景制作的關于有限資源完全與非完全分配
的模型,圖1.2是我們希望達到的效果。
典型界面
為了完整的模擬這種場景,我們將演示其中最重要的兩個步驟:
第一步:登記資源,如圖1.1。
主徒?分組?標題急救量順序
?eb4d2a84b7…fruit蘋果51
eb4d2a84b7…fruit橘子42
eb4d2a84b7...fruit香蕉33
eb4d2384b7…fruit苣喔64
eb4d2384b7…fruit芒果25
保存添加刪除
圖1.1資源登記
第二步:分配資源,如圖1.2。
名麻蘋果幡子香蕉草套芒果一
,李芳偉0□□□□
輻0□□□□
李桂平回□□□□
柳香回□□□□
孫靜0□□□□
王小亮□0□□口
張揚口0□□口
趙文力口回□□□
趙欣欣口0□□□
周明明口口□□□
已分配/總量5/54〃0/30/60/2▼
保存
靈活使用dorado5v1.0
圖1.2分配資源
另外在資源分配時還要做一些保護工作,如圖1.3。
保護:當沒有資源可以分配時,需要給出提醒并阻止不正確的分配。
林
府草莓芒果'
李芳偉0□
□□□
李
3回□
□□□
平
李桂0□
□□□
柳
W回
□1—11—;1—I
靜
回
孫VindovsInternetExplorer|^|
□R0/
□0小已經(jīng)達到了最大數(shù)量,不能再分配了
□
趙
史力0
£確定一,
趙
欣欣
□回
周
明明
口
口
□□□
已分配/總量5/54/40/30/60/2
圖1.3資源分配中的約束
數(shù)據(jù)庫準備
我們需要3張表:
第一張:Mark_Resource資源信息表,結構如下圖:
列名1數(shù)據(jù)類型1長度1允i轉
9idvarchar50
groupbyvarchar50
titlevarchar50
totalint4
orderbyint4?
第二張:Mark_People人員信息表,結構如下圖:
列名1數(shù)據(jù)類型1長度1允詳空
id“archer50
namevarchar50
dept」dvarchar50?
salarydecimal9?
第三張:Mark_People_Resource資源分配表,結構如下圖:
列名|數(shù)據(jù)類型|長度|允許空|
peoplevarchai,50
resource“archer50
groupbyvarchar50
靈活使用dorado5v1.0
解決思路
圖1.1資源登記的思路如下:
1.使用keyGenerator為資源分配主鍵。
2.使用DataTable組件,保證批量數(shù)據(jù)的錄入。
圖1.2與圖1.3分配資源的思路如下:
1,定義一個CustomDataset叫做datasetResourceo
2.datasetResource預定義兩個字段key>name分別代表資源分配接收者的主鍵和名
字。
3.在服務器端視圖模型的initDatasets方法中根據(jù)資源分組依據(jù)訪問數(shù)據(jù)庫,從
Mark_Resource資源表中獲得資源。
4.根據(jù)藐得的資源為datasetResource添加字段。其中資源的主鍵作為字段的name,
資源的名稱作為字段的label;每個資源的最大數(shù)量信息被記錄在dataResource的
$maxSumString參數(shù)中。
5.在服務器端視圖模型的doLoadData方法中為datasetResource填充記錄。訪問數(shù)
據(jù)庫,從Mark_People表中獲得人員信息,向datasetResource中填充記錄,可
以正確填充key與name字段內(nèi)容;根據(jù)資源分組依據(jù)從Mark_People_Resource
獲得資源的已分配的信息,正確填充動態(tài)生成字段的內(nèi)容。
6.客戶端使用DataTable顯示信息。
7.資源字段使用CheckBox渲染,并且自定義兩個屬性sum和maxSum分別表示資源總
量和已經(jīng)分配的數(shù)量。maxSum的值通過解析datasetResource的$maxSumString
參數(shù)值獲得,sum通過遍歷datasetResource獲得。
8.利用DataTable的onFooterRefresh事件實時反應資源的分配情況。
9.利用Dataset的beforeChange事件保證資源分配的正確性。
知識點
使用自定義的數(shù)據(jù)源
在JDBC盛行的時代里很多公司自主開發(fā)了持久層解決方案,經(jīng)過多個項目的考驗后,
通常能夠滿足特定領域的需求。Dorado為這類持久層提供了方便的集成接口,步驟如下:
1.在datasource.xml聲明我們自定義的數(shù)據(jù)源,配置如圖1.4:
k?xiixlveision=°l.encodingcf,UTF-B,r>>
<datasources>
<datasourcenanie=rrcustoiafrtvpe=,rUSERrr>
<dialect>com.bstek.dorado,data.db.dialect.MSSQLDialect</dialect>
<clazz>com.bstek.mark.db.CustomConnectionFactory</clazz>
</dat-asource>
</datasources>
圖1.4自定義數(shù)據(jù)源的配置信息
從上圖中我們可以看出如下信息:
靈活使用dorado5v1.0
1.自定義數(shù)據(jù)源的類型一定是USER(即type=〃USER〃)。
2?該數(shù)據(jù)源的名稱為customo
3?該數(shù)據(jù)源的方言為com.bstek.dorado.data.db.dialect.MSSQLDialect,
即使用SQLServer數(shù)據(jù)庫。
4.該數(shù)據(jù)源的實現(xiàn)類為com.bstek.mark.db.CustomConnectionFactory,當
我們需要使用java.sql.Connection時,dorado會自動的從這個類中獲取。
2.你大概又寸com.bstek.mark.db.CustomConn6ctionFactory感興趣了,事實上
它繼承了com.bstek.dorado.common.ds.DataSourceConfig類,并且僅僅需要實
現(xiàn)publicConnectiongetConnection()方法,如卜代碼。
publicConnectiongetConnection(){
Stringurl='*jdbc:microsoft:sqlserver:'1+
n//localhost:1433;DatabaseName=markdemon;
Stringuser=nsan;
Stringpassword=nn;
Connectionconn=null;
try(
Class.forName(ncom.microsoft.jdbc.'1+
Hsqlserver.SQLServerDriver*').newlnstance();
conn=DriverManager.getConnection(url,user,password);
}catch(InstantiationExceptione){
e.printStackTrace();
}catch(IllegalAccessExceptione){
e.printStackTrace();
}catch(ClassNotFoundExceptione){
e.printStackTrace();
}catch(SQLExceptione){
e.printStackTrace();
)
returnconn;
}
上面的代碼硬編碼了使用JDBC獲取數(shù)據(jù)庫的連接僅僅是為了演示該功能的代碼接口
而已,實際生產(chǎn)中這里會調用公司內(nèi)部持久層來獲得與數(shù)據(jù)庫的連接。
3.經(jīng)過了上面的兩個步驟后,我們就可以使用該數(shù)據(jù)源了,方法與使用JDBC或JND1
方式完全相同。例如在圖1.5中我們使用custom數(shù)據(jù)源定義了一個AutoSqlDataset,
id為datasetResource,對應的數(shù)據(jù)庫表為mark_resource。
靈活使用dorado5v1.0
ZPropertiesInspector]EventsInspector/SourceEditor
圖1.5使用自定義數(shù)據(jù)源
利用keyGenerator屬性為記錄自動分配主鍵
在圖1.5中注意到在字段id中定義了?叫做keyGenerator的屬性,這是在使用
Dorado的主鍵生成功能,保證我們不需要書寫JAVA代碼就可以自動的為插入到數(shù)據(jù)庫的
記錄分配主鍵,這樣可以脫離枯燥的分配主鍵的循環(huán)的JAVA代碼,具體步驟如下:
1.定義全周的主鍵生成策略,在setting.xml中配置data.keyGenerator。
<propertyname="data.keyGenerator**value=n
com.bstek.mark.key.DemoKeyGenerator”/>
2.上面的com.bstek.mark,key.DemoKeyGenerator類就是產(chǎn)生主鍵的工廠,需要
實現(xiàn)com.bstek.dorado.data.KeyGenerator接口,事例代碼如下:
publicclassDemoKeyGeneratorimplementsKeyGenerator{
publicStringgetKey(Datasetdataset,ReadRecordrecord,Stringvalue)
throwsException{
Stringkey=UniqueKey.getKey();
returnkey;
)
}
3.在DBDataset的主鍵字段中配置keyGenerator屬性,如圖1.6。
Outime:
*StandardViewiRotatedView—MergedView
Xlew
PropertykeyGenerator
」Datasets
namekeyGenerator
?-fdatasetResource
口Joinsvalue
a匕Fields
七Gid
三Properties
keyGenerator
靈活使用dorado5v1.0
圖1.6使用keyGenerator
在上圖中并沒有配置keyGenerator屬性的value值,事實上這里配制的value值
會傳遞到DemoKeyGenerator的getKey方法的第三個參數(shù)中(即Stringvalue的參
數(shù)),也就是說如果我們具有很多個主鍵生成策略,那么可以通過的值來選擇不同的
策略,所以DemoKevGenerator的職能更力口像是主鍵分配策略的工廠。當然我們也可以
通過Dataset或者ReadRecord參數(shù)來選擇策略,不過這樣的設計復雜了一些,最簡單
的就是僅僅使用一種策略。如果項目中使用的是Oracle數(shù)據(jù)庫并且唯一的主鍵分配策略
是從不同的Sequence中獲得的鍵值,那么Dorado已經(jīng)為我們提供了這樣的
keyGenerator,使用時setting.xml做如下配置:
<propertyname='*data.keyGenerator"value=n
com,bstek.dorado.data.db.dialect.OracleSequenceKeyGeneratorn/>
另外主鍵字段的keyGenerator屬性的value中填寫Sequence的名稱,如圖1.7。
ip________________L
Outline:
-StandardView?Rotat&dViewMergedView
*TviewA
PropertykeyGenerator
:一」Datasets
namekeyGenerator
.BifdatasetResource
valueresource_sequence
OJoins
啟OFields
母@ld
5Properties
圖1.7使用OracleSequenceKeyGenerator的字段配置
注:實現(xiàn)圖1.1的功能我們只用到了上面的兩個知識點,沒有書寫任何JAVA代碼,主體
功能只需要配置信息就可以完成,所以具體實現(xiàn)不在這里累述,圖1.2的功能需要重點描
述。
服務器端動態(tài)為Dataset添加字段。
在訪問圖1.2即資源分配的頁面時,我們需要知道對哪組資源進行分配,分組信息通
過URL參數(shù)傳遞,所以URL中應該包含groupby=xxx的參數(shù),本事例中使用
groupby=fruito當知道了資源分組信息后,我們就可以訪問數(shù)據(jù)庫得到該組下的所有資
源了,每一種資源作為dataset的一個字段存在,所以字段的數(shù)量不是確定的,我們需要
調用Server端Dataset與BaseField的AP工動態(tài)的為dataset添加字段,通常來說
這個步驟是在視圖模型的initDatasets()中做。圖1.8是該方法的完整代碼:
protectedvoidinitDatasets()throwsException{
super.initDatasets();
if(this.getState()==ViewModel.STATE_VIEW){
//@1.檢驗groupby參數(shù)
Stringgroupby=DoradoContext.getContext().
getParameter("groupbyn);
if(null==groupby||nn.equals(groupby)){
thrownewException("請在url后添力口groupby參數(shù),”+
”例如:?groupby=fruitn);
)
靈活使用dorado5v1.0
StringBuffermaxSumParameter=newStringBuffer();
ViewBaseFieldfield=null;
ViewDatasetdatasetResource=
this.getDataset(,,datasetResourceH);
//@2.獲得需要分配的資源
DBStatementdbStmt=newDBStatement();
dbStmt.setDataSource("custom");
dbStmt.setSql(^select*frommark_resource”+
"wheregroupby=:groupbyorderbyorderby");
dbStmt.parameters().setstring("groupby”,groupby);
Listresult=dbStmt.queryForList();
dbStmt.close();
//03.為datasetR一source添力「字段
for(inti=0<size=result.size();i<size;i++){
VariantSetvs=(VariantSet)result.get(i);
field=(ViewBaseField)datasetResource.
addField(vs.getString("id"));
field.setDataType("int");
field.setDefaultvalue(0);
field.setLabel(vs.getString(ntitlen));
maxSumParameter.append(field.getName()+":"+
vs.getInt("total")+n;n);
)
datasetResource.parameters().setstring(n$maxSumStringH,
maxSumParameter.toString());
}
}
圖1.8動態(tài)為Dataset添加字段
在圖1.8中我們遍歷通過資源分組信息得到的資源列表為datasetResource添加
字段,資源的id作為了字段的id,資源的title作為了字段的label,并且字段為int類
型默認值為0。還注意到為datasetResource添加了$maxSumString的參數(shù),其值為:
'、資源工D:資源數(shù)量;〃格式組成的字符串,作用是在客戶端為資源分配的限制提供依據(jù)。
既然字段是動態(tài)生成的那么向dataset中添加數(shù)據(jù)是不是很困難呢?通常不會很困
難,因為字段是根據(jù)業(yè)務動態(tài)添加的,數(shù)據(jù)也是根據(jù)業(yè)務填充的,由于來源于相同的依據(jù),
所以并不會有很大的阻力,圖1.9是向datasetResource填充正確數(shù)據(jù)的完整代碼,
由于在這個場景中不能一次給予datasetResource正確的記錄,所以使用了一個小技巧,
利用HashMap為datasetResource記錄建立ID的索弓I。
protectedvoiddoLoadData(ViewDatasetdataset)throwsException{
super.doLoadData(dataset);
if(this.getState()==ViewModel.STATE_VIEW&&
dataset.getld().equals("datasetResource")){
//01.檢驗groupby
靈活使用dorado5v1.0
Stringgroupby=DoradoContext.getContext().
getParameter(ngroupbyH);
if(null==groupby||"H.equals(groupby)){
thrownewException("請在url后添加groupby參數(shù),”+
“例如:?groupby=fruitn);
)
//@2.向datasetResource中添力口初始化的記錄,并構造resourceRecordMap
DBStatementdbStmt=newDBStatement();
dbStmt.setDataSource("custom0);
dbStmt.setSql(DBStatement.SELECT,"mark_peoplen);
ListpeopleList=dbStmt.queryForList();
dbStmt.close();
MapresourceRecordMap=newHashMap(peopleList.size());
for(inti=0;KpeopleList.size();i++){
VariantSetvs=(VariantSet)peopleList.get(i);
Recordr=dataset.insertRecord();
n11
r.setstring(keyzvs.getString("id"));
r.setstring(unamen,vs.getString(nnameH));
r.setState(Record.STATE_NONE);
resourceRecordMap.put(vs.getString("id"),r);
)
dataset.moveFirst();
//@3.為datasetResource填充真正的數(shù)據(jù)
dbStmt.setSql(DBStatement.SELECT,nmark_people_resourcen);
dbStmt.parameters().setstring("groupby”,groupby);
ListpeopleResourceList=dbStmt.queryForList();
dbStmt.close();
for(inti=0;KpeopleResourceList.size();i++){
VariantSetvs=(VariantSet)peopleResourceList.get(i);
Stringpeopleld=vs.getString(npeoplen);
Recordresource=(Record)resourceRecordMap.get(peopleld);
if(null!=resource){
resource.setlnt(vs.getString("resource”),1);
resource.setState(Record.STATE_NONE);
)
)
)
}
圖1.9給datasetResource添加正確的數(shù)據(jù)
靈活使用dorado5v1.0
重視EventManager的使用
到目前為止我們已經(jīng)可以將存儲在數(shù)據(jù)庫中的資源分配信息加載到Dataset中了,服
務器端的工作已經(jīng)結束。對頁面和組件的展現(xiàn)形式需要通過客戶端的JavaScript控制,
在介紹客戶端的代碼之前,現(xiàn)看一下該視圖模型的配置信息,如圖1.10。
Outline:-StandardView'IRotatedViewi~MeraedView
*7*view
PropertytableResource
5Datasets
confirmCancel
〈£■ifadatasetResource
?MasterLlnkconfirmDelete
idcjFieldsdatasetdatasetResource
Si。keyeditable
電國&namefixedColumn
+」ParametersifooterHelght
,:「PropertiesheaderHeight
SOControlsheight300
七曲黨國賽
highlightselection
日name
idtableResource
t-'QcmdSave
Ignored
3Datasetinfos
-datasetResourceleft
三:ParameterslocalSort
?groupbymaxRow
劍btSavereadonlytrue
見btEditrowDraggable
OPropertiesrowHeight
圖1.10資源分配視圖模型的配置信息
由圖1?9和圖1.10可見,先定義了datasetResource的key與name字段,其
他的字段是服務器端動態(tài)生成的。tableResource綁定了datasetResource但只定義
了name歹U,那么其他的列是什么時候在哪里怎樣添加的呢?
答:是在客戶端視圖模型的onDatasetsPrepared(ViewModel)事件中最終調用
EventManager添力H的。
圖1.11是客戶端onDatasetsPrepared(ViewModel)事件完整代碼。
baseDataset=datasetResource;
//@1.初始化dataset.field.maxSum
Base?initFieldMaxSum(baseDataset);
//@2,初始化dataset.field.sum
Base.initFieldSum(baseDataset);
//@3.給dataset添加約束
EventManager.addDoradoEvent(baseDataset,
“beforeChange",Base.updateFieldSum);
//@4.初始化datatable.column
Base.initDatatableColumn(baseDataset,tableResource);
//@5.初始化btEdit的。nClick事件
EventManager.addDoradoEvent(btEdit,"onClick',,
function(button){
Base,DataTabletoEditState(tableResource);
button.disabled=true;
靈活使用dorado5v1.0
btSave.disabled=false;
});
//@6.成功保存后的動作
EventManager.addDoradoEvent(cmdSave,"onSuccess**,
function(command){
Base,DataTabletoReadState(tableResource);
btSave.disabled=true;
btEdit.disabled=false;
});
圖1.11onDatasetsPrepared(ViewModel)事件完整代碼
圖1.11中的代碼非常簡單,只做了兩件事情:
第一件:為了完成業(yè)務功能進行的初始化工作。
第二件:通過EventManager為DoradoElement添力II事件。
當查看該視圖模型的源文件時,你會發(fā)現(xiàn)我們并沒有通過studio為組件和Dataset
添加任何事件,事實上這些事件是使用JavaScript禾!]用EventManager添力口的。這種
做法的意義遠大于EventManager的功能,詳細內(nèi)容我們將在事例二中介紹,并且引入一
種叫做VBC的面向業(yè)務的客戶端編碼風格。
現(xiàn)在需要說明客戶端代碼的思路了,還記得我們在服務器端為datasetResource添
加一個叫做$maxSumString的參數(shù)嗎?里面記錄著每種資源可分配的數(shù)量。在客戶端我們
就會使用它了,通過調用Base.initFieldMaxSum(baseDataset);將資源可分配數(shù)量
信息記錄在對應字段的maxSum屬性上;通過調用Base.initFieldSum(baseDataset);
將資源已分配數(shù)量記錄在字段的sum屬性上;這兩個信息通過DataTable的
onFooterRefresh事件顯示在footer上,對資源分配的限制是通過
datasetResource的beforeChange監(jiān)視的。
DataTable的footer的用法
在圖1.2中我們看到了DataTable的footer的效果,近距離觀看如下圖。
巳分配/總量5/54/41/33/60/2
如果您想使用DataTable的footer,只需要將DataTable的showFooter屬性
設置為true。
sh^F^ote?k
使用footer顯示什么內(nèi)容可以通過onFooterRefresh事件來實現(xiàn)。
Ige1.'inu
巳OControls
-ffltableResourcefunctiononFooterRefresh(column,cell,value){
nametell.innerHTML="已分配/總量”;|
由于dorado提供了事件編程接口,所以可以在footer上實現(xiàn)動態(tài)的復雜的顯示效
果,在該事例的每個資源對應的Column的onFooterRefresh事件的代碼是這樣的:
Base.drawFooter=function(column,cell,value){
varfield=baseDataset.getField(column.getField());
靈活使用dorado5v1.0
varfootHtml=n<divstyle=*width:100%;text-align:center1>n
+Base.getFieldSum(baseDataset,field)
++field.maxSum+n</div>n;
cell.innerHTML=footHtml;
}
通過Dataset的beforeChange事件維護業(yè)務約束
該事件的關鍵特性是:如果返回值為AbortException或DoradoException可以
阻止用戶對Dataset中值的修改,如果返回的是AbortException則系統(tǒng)會終止默認的
后續(xù)操作,如果返回的是DoradoException系統(tǒng)會首先給出提示信息然后終止默認操作。
圖1.12中的Base.updateFieldSum就是datasetResource的beforeChange的
事件句柄,如果用戶分配資源的數(shù)量大于資源總量會返回DoradoException,效果見圖
1.3:
Base.updateFieldSum=function(dataset,record,field,value){
varsum=field.sum;
if(sum===undefined||sum===null){return;}
varresultSum=0;
switch(value){
case"0”:
Base.setFieldSum(null,field,parselnt(sum)-1);
break;
case"1":
resultSum=parselnt(sum)+1;
if(resultSum>parselnt(field.maxSum)){
returnnewDoradoException("已經(jīng)達至U了最大數(shù)量,不能再4個西己了”);
}else{
Base.setFieldSum(null,field,resultSum);
}
break;
default:
alert(nother.value="+value);
)
}
圖1.12通過Dataset的beforeChange事件維護業(yè)務約束
代碼清單
到目前為止我們已經(jīng)對客戶端的代碼總體分析了?次,下面是詳細代碼,也許你還會從
中看出幾分珠磯,見圖1.13。
varbaseDataset;
varBase={};
/**
靈活使用dorado5v1.0
*初始化field,sum
*?paramDatasetdataset
*?paramField[]fieldArray[optional]
*注:如果fieldArray沒有值,則遍歷dataset的所有field
*/
Base.initFieldSum=function(datasetAfieldArray){
if(!fieldArray){
varfieldCount=dataset.getFieldCount();
for(vari=0;i<fieldCount;i++){
Base.setFieldSum(dataset,dataset.getFieId(i));
}
}else{
varfieldCount=fieldArray.length;
for(vari=0;i<fieldCount;i++){
Base.setFieldSum(dataset,fieldArray[i]);
)
)
}
/**
*初始化field.maxSum
*?paramDatasetdataset
*@paramintdefaultvalue
*/
Base.initFieldMaxSum=function(dataset,defaultvalue){
var$maxSumString=dataset.parameters().getValue(n$maxSumStringH);
vargetFieldMaxSum=function(parameterName){
varindexl=$maxSumString.indexOf(parameterName);
if(indexKO){returnparselnt(defaultValue);}
nn
varindex2=$maxSumString.indexOf(:z
indexl+parameterName.length);
varindex3=$maxSumString.indexOf(";n,index2+l);
varmaxSum=$maxSumString.substring(index2+lzindex3);
returnmaxSum;
);
varfield,fieldName;
for(vari=0,fieldCount=dataset.getFieldCount();i<fieldCount;i++){
field=dataset.getField(i);
fieldName=field.getName();
if(fieldName==ukeyn||fieldName==,,nameH){continue;)
field.maxSum=getFieldMaxSum(field.getName());
*給dataset添加I約束
BSTEK靈活使用dorado5v1.0
*@paramDatasetdataset
*?paramRecordrecord
*?paramFieldfield
*QparamAnyvalue
*注:在dataset.beforeChange事件中調用的,僅僅用至U了field和value參數(shù)
*/
Base.updateFieldSum=function(dataset,record,field,value){
varsum=field.sum;
if(sum===undefinedI|sum===null){return;}
varresultSum=0;
switch(value){
case”0":
Base?setFieldSum(null,field,parselnt(sum)-1);
break;
case”1”:
resultSum=parselnt(sum)+1;
if(resultSum>parselnt(field.maxSum)){
returnnewDoradoException("已經(jīng)達至!j了最大數(shù)量,不能再分配了”);
}else{
Base.setFieldSum(null,field,resultSum);
}
break;
default:
alert(nother.value="+value);
}
|
/**
*初始化datatable.column
*@paramDatasetdataset
*@paramDataTabledatatable
*注:根據(jù)dataset給datatable添加column,并設置column的相關屬性和事件
*/
Base.initDatatableColumn=function(datasetzdatatable){
varfieldcount=dataset.getFieldCoun
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 同城買賣合同范例
- 訂購鮮花合同范例
- 進口牛奶銷售合同范例
- 水果苗木合同范例
- 公司出納擔保合同范例
- 磚供需合同范例
- ipad制作合同范例
- 工地承包安全施工合同范例
- ktv店鋪轉讓合同范例
- 租賃設備合作合同范例
- 華為技術有限公司財務報表分析-畢業(yè)論文
- 19-24個月嬰兒親子活動設計與指導(上)
- 2024年中國郵政中郵信息科技北京有限公司招聘筆試參考題庫含答案解析
- 醫(yī)德醫(yī)風考試試題及答案
- 2024年廣東省高三一模英語試題答案講評詞匯積累課件
- 垃圾箱施工方案
- DB21-T 2961-2018雙條杉天牛防治技術規(guī)程
- 公眾場所人流密度分析報告
- 學校宿管員培訓課件
- 7.1開放是當代中國的鮮明標識課件-高中政治選擇性必修一當代國際政治與經(jīng)濟(1)2
- 經(jīng)濟法課件:企業(yè)破產(chǎn)法
評論
0/150
提交評論