靈活使用dorado5資料_第1頁(yè)
靈活使用dorado5資料_第2頁(yè)
靈活使用dorado5資料_第3頁(yè)
靈活使用dorado5資料_第4頁(yè)
靈活使用dorado5資料_第5頁(yè)
已閱讀5頁(yè),還剩77頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

靈活使用dorado5v1.0

靈活使用dorado5

2007年9月

靈活使用dorado5v1.0

目錄

靈活使用doardo54

前言4

事例一:用于資源分配的DataTable5

情景描述5

典型界面5

數(shù)據(jù)庫(kù)準(zhǔn)備6

解決思路7

知識(shí)點(diǎn)7

使用自定義的數(shù)據(jù)源7

利用keyGenerator屬性為記錄自動(dòng)分配主鍵9

服務(wù)器端動(dòng)態(tài)為Dataset添加字段。10

重視EventManager的使用13

DataTable的footer的用法14

通過Dataset的beforeChange事件維護(hù)業(yè)務(wù)約束15

代碼清單15

事例二:模擬多行表頭的DataRble22

情景描述22

典型界面23

數(shù)據(jù)庫(kù)準(zhǔn)備24

解決思路25

知識(shí)點(diǎn)25

服務(wù)器端動(dòng)態(tài)生成Dataset25

VBC:一種面向業(yè)務(wù)的客戶端的代碼風(fēng)格29

客戶端動(dòng)態(tài)生成DataBble34

使用onRefresh事件控制顯示形式35

利用listDatasets()函數(shù)得到頁(yè)面所有的Dataset35

控制Dataset部分記錄可以被編輯36

控制DataBble的部分Cell可以被編輯36

手動(dòng)修改記錄的狀態(tài)36

UpdateCommand的reduceReturnlnfo屬性37

事例三:具有三種狀態(tài)的靜態(tài)樹38

情景描述38

典型界面39

Dataset結(jié)構(gòu)40

解決思路41

代碼清單41

知識(shí)點(diǎn)47

_CONTEXT_PATH常量47

手動(dòng)為節(jié)點(diǎn)添加子節(jié)點(diǎn)48

利用遞歸方法構(gòu)造完整的樹48

靈活使用dorado5v1.0

自定義Tree的onRefreshNode事件49

同步父子節(jié)點(diǎn)狀態(tài)同步的算法50

事例四:分組顯示的RadioBox53

情景描述53

典型界面53

數(shù)據(jù)庫(kù)準(zhǔn)備54

Dataset結(jié)構(gòu)55

解決思路55

代碼清單55

知識(shí)點(diǎn)61

引入用戶JavaScript庫(kù)62

按照面向?qū)ο蟮乃枷霐U(kuò)展組件62

組件包裝器63

擴(kuò)展組件的激活函數(shù)63

客戶端創(chuàng)建菜單64

視圖約束(ViewRules)的入口65

自定義組件的Model層66

自定義組件Model層對(duì)外的數(shù)據(jù)接口67

事例五:代碼翻譯69

情景描述69

幾種常見的方案69

方案一:數(shù)據(jù)庫(kù)翻譯69

方案二:服務(wù)器端翻譯69

方案三:客戶端翻譯69

一種另類的翻譯70

使用步驟70

解決思路72

源代碼72

靈活使用dorado5v1.0

靈活使用doardo5

刖B

《靈活使用dorado5》是面向具有dorado中級(jí)開發(fā)能力的群體,即滿足《dorado

學(xué)習(xí)建議》中3級(jí)要求的開發(fā)者。如果您對(duì)文中的概念或者API不是非常熟練可以參考

dorado5的其他資料,強(qiáng)烈推薦《dorado5用戶指南》。

Dorado是款結(jié)合了RIA/AJAX技術(shù)的面向企業(yè)級(jí)的交互型應(yīng)用的展現(xiàn)層中間件。

獨(dú)特的Dorado引擎維護(hù)了客戶端MVC模型以及客戶端與服務(wù)器端的AJAX通信。將數(shù)據(jù)

與展現(xiàn)形式分離的思想導(dǎo)致Dataset數(shù)據(jù)集和Control組件的誕生,從此客戶端的關(guān)注

點(diǎn)山展現(xiàn)形式轉(zhuǎn)移到了對(duì)數(shù)據(jù)的控制上,提高了對(duì)業(yè)務(wù)邏輯的抽象層次,增強(qiáng)了對(duì)業(yè)務(wù)邏輯

的控制能力,加速了對(duì)展現(xiàn)形式變化的響應(yīng)速度。

Dorad。是按照企業(yè)應(yīng)用通用場(chǎng)景建模的,幾乎滿足所有的企業(yè)交互型應(yīng)用的需要。由

于這個(gè)建?;A(chǔ)使得我們?cè)诤芏嗲闆r下只要通過配置或者編寫少量的腳本就可以滿足需求。

對(duì)于某些特殊業(yè)務(wù)可能需要我們編寫一定量的代碼才能滿足,好在我們是站在巨人的肩膀上

思考問題,有了Dorado為我們提供的服務(wù)器端與客戶端的完整易用的框架模型,只要稍

加思考通??梢栽诖嘶A(chǔ)上快速找到解決方案。本文檔也是站在這樣的高度向大家展示如何

靈活運(yùn)用Dorado模型以及按照Dorado的思維來解決非典型的應(yīng)用需求,文檔重點(diǎn)以思

路分析與代碼展示為主,并且講述了一種叫做VBC的面向業(yè)務(wù)的客戶端代碼的編寫風(fēng)格,

幫助我們保持業(yè)務(wù)流程和腳本結(jié)構(gòu)的清晰度。

靈活使用dorado5v1.0

事例一:用于資源分配的DataTable

情景描述

本事例是按照客戶向供應(yīng)商購(gòu)買服務(wù)包的應(yīng)用場(chǎng)景制作的關(guān)于有限資源完全與非完全分配

的模型,圖1.2是我們希望達(dá)到的效果。

典型界面

為了完整的模擬這種場(chǎng)景,我們將演示其中最重要的兩個(gè)步驟:

第一步:登記資源,如圖1.1。

主徒?分組?標(biāo)題急救量順序

?eb4d2a84b7…fruit蘋果51

eb4d2a84b7…fruit橘子42

eb4d2a84b7...fruit香蕉33

eb4d2384b7…fruit苣喔64

eb4d2384b7…fruit芒果25

保存添加刪除

圖1.1資源登記

第二步:分配資源,如圖1.2。

名麻蘋果幡子香蕉草套芒果一

,李芳偉0□□□□

輻0□□□□

李桂平回□□□□

柳香回□□□□

孫靜0□□□□

王小亮□0□□口

張揚(yáng)口0□□口

趙文力口回□□□

趙欣欣口0□□□

周明明口口□□□

已分配/總量5/54〃0/30/60/2▼

保存

靈活使用dorado5v1.0

圖1.2分配資源

另外在資源分配時(shí)還要做一些保護(hù)工作,如圖1.3。

保護(hù):當(dāng)沒有資源可以分配時(shí),需要給出提醒并阻止不正確的分配。

府草莓芒果'

李芳偉0□

□□□

3回□

□□□

李桂0□

□□□

W回

□1—11—;1—I

孫VindovsInternetExplorer|^|

□R0/

□0小已經(jīng)達(dá)到了最大數(shù)量,不能再分配了

史力0

£確定一,

欣欣

□回

明明

□□□

已分配/總量5/54/40/30/60/2

圖1.3資源分配中的約束

數(shù)據(jù)庫(kù)準(zhǔn)備

我們需要3張表:

第一張:Mark_Resource資源信息表,結(jié)構(gòu)如下圖:

列名1數(shù)據(jù)類型1長(zhǎng)度1允i轉(zhuǎn)

9idvarchar50

groupbyvarchar50

titlevarchar50

totalint4

orderbyint4?

第二張:Mark_People人員信息表,結(jié)構(gòu)如下圖:

列名1數(shù)據(jù)類型1長(zhǎng)度1允詳空

id“archer50

namevarchar50

dept」dvarchar50?

salarydecimal9?

第三張:Mark_People_Resource資源分配表,結(jié)構(gòu)如下圖:

列名|數(shù)據(jù)類型|長(zhǎng)度|允許空|

peoplevarchai,50

resource“archer50

groupbyvarchar50

靈活使用dorado5v1.0

解決思路

圖1.1資源登記的思路如下:

1.使用keyGenerator為資源分配主鍵。

2.使用DataTable組件,保證批量數(shù)據(jù)的錄入。

圖1.2與圖1.3分配資源的思路如下:

1,定義一個(gè)CustomDataset叫做datasetResourceo

2.datasetResource預(yù)定義兩個(gè)字段key>name分別代表資源分配接收者的主鍵和名

字。

3.在服務(wù)器端視圖模型的initDatasets方法中根據(jù)資源分組依據(jù)訪問數(shù)據(jù)庫(kù),從

Mark_Resource資源表中獲得資源。

4.根據(jù)藐得的資源為datasetResource添加字段。其中資源的主鍵作為字段的name,

資源的名稱作為字段的label;每個(gè)資源的最大數(shù)量信息被記錄在dataResource的

$maxSumString參數(shù)中。

5.在服務(wù)器端視圖模型的doLoadData方法中為datasetResource填充記錄。訪問數(shù)

據(jù)庫(kù),從Mark_People表中獲得人員信息,向datasetResource中填充記錄,可

以正確填充key與name字段內(nèi)容;根據(jù)資源分組依據(jù)從Mark_People_Resource

獲得資源的已分配的信息,正確填充動(dòng)態(tài)生成字段的內(nèi)容。

6.客戶端使用DataTable顯示信息。

7.資源字段使用CheckBox渲染,并且自定義兩個(gè)屬性sum和maxSum分別表示資源總

量和已經(jīng)分配的數(shù)量。maxSum的值通過解析datasetResource的$maxSumString

參數(shù)值獲得,sum通過遍歷datasetResource獲得。

8.利用DataTable的onFooterRefresh事件實(shí)時(shí)反應(yīng)資源的分配情況。

9.利用Dataset的beforeChange事件保證資源分配的正確性。

知識(shí)點(diǎn)

使用自定義的數(shù)據(jù)源

在JDBC盛行的時(shí)代里很多公司自主開發(fā)了持久層解決方案,經(jīng)過多個(gè)項(xiàng)目的考驗(yàn)后,

通常能夠滿足特定領(lǐ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ù)庫(kù)。

4.該數(shù)據(jù)源的實(shí)現(xiàn)類為com.bstek.mark.db.CustomConnectionFactory,當(dāng)

我們需要使用java.sql.Connection時(shí),dorado會(huì)自動(dòng)的從這個(gè)類中獲取。

2.你大概又寸com.bstek.mark.db.CustomConn6ctionFactory感興趣了,事實(shí)上

它繼承了com.bstek.dorado.common.ds.DataSourceConfig類,并且僅僅需要實(shí)

現(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ù)庫(kù)的連接僅僅是為了演示該功能的代碼接口

而已,實(shí)際生產(chǎn)中這里會(huì)調(diào)用公司內(nèi)部持久層來獲得與數(shù)據(jù)庫(kù)的連接。

3.經(jīng)過了上面的兩個(gè)步驟后,我們就可以使用該數(shù)據(jù)源了,方法與使用JDBC或JND1

方式完全相同。例如在圖1.5中我們使用custom數(shù)據(jù)源定義了一個(gè)AutoSqlDataset,

id為datasetResource,對(duì)應(yīng)的數(shù)據(jù)庫(kù)表為mark_resource。

靈活使用dorado5v1.0

ZPropertiesInspector]EventsInspector/SourceEditor

圖1.5使用自定義數(shù)據(jù)源

利用keyGenerator屬性為記錄自動(dòng)分配主鍵

在圖1.5中注意到在字段id中定義了?叫做keyGenerator的屬性,這是在使用

Dorado的主鍵生成功能,保證我們不需要書寫JAVA代碼就可以自動(dòng)的為插入到數(shù)據(jù)庫(kù)的

記錄分配主鍵,這樣可以脫離枯燥的分配主鍵的循環(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)生主鍵的工廠,需要

實(shí)現(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值,事實(shí)上這里配制的value值

會(huì)傳遞到DemoKeyGenerator的getKey方法的第三個(gè)參數(shù)中(即Stringvalue的參

數(shù)),也就是說如果我們具有很多個(gè)主鍵生成策略,那么可以通過的值來選擇不同的

策略,所以DemoKevGenerator的職能更力口像是主鍵分配策略的工廠。當(dāng)然我們也可以

通過Dataset或者ReadRecord參數(shù)來選擇策略,不過這樣的設(shè)計(jì)復(fù)雜了一些,最簡(jiǎn)單

的就是僅僅使用一種策略。如果項(xiàng)目中使用的是Oracle數(shù)據(jù)庫(kù)并且唯一的主鍵分配策略

是從不同的Sequence中獲得的鍵值,那么Dorado已經(jīng)為我們提供了這樣的

keyGenerator,使用時(shí)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的字段配置

注:實(shí)現(xiàn)圖1.1的功能我們只用到了上面的兩個(gè)知識(shí)點(diǎn),沒有書寫任何JAVA代碼,主體

功能只需要配置信息就可以完成,所以具體實(shí)現(xiàn)不在這里累述,圖1.2的功能需要重點(diǎn)描

述。

服務(wù)器端動(dòng)態(tài)為Dataset添加字段。

在訪問圖1.2即資源分配的頁(yè)面時(shí),我們需要知道對(duì)哪組資源進(jìn)行分配,分組信息通

過URL參數(shù)傳遞,所以URL中應(yīng)該包含groupby=xxx的參數(shù),本事例中使用

groupby=fruito當(dāng)知道了資源分組信息后,我們就可以訪問數(shù)據(jù)庫(kù)得到該組下的所有資

源了,每一種資源作為dataset的一個(gè)字段存在,所以字段的數(shù)量不是確定的,我們需要

調(diào)用Server端Dataset與BaseField的AP工動(dòng)態(tài)的為dataset添加字段,通常來說

這個(gè)步驟是在視圖模型的initDatasets()中做。圖1.8是該方法的完整代碼:

protectedvoidinitDatasets()throwsException{

super.initDatasets();

if(this.getState()==ViewModel.STATE_VIEW){

//@1.檢驗(yàn)groupby參數(shù)

Stringgroupby=DoradoContext.getContext().

getParameter("groupbyn);

if(null==groupby||nn.equals(groupby)){

thrownewException("請(qǐng)?jiān)趗rl后添力口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動(dòng)態(tài)為Dataset添加字段

在圖1.8中我們遍歷通過資源分組信息得到的資源列表為datasetResource添加

字段,資源的id作為了字段的id,資源的title作為了字段的label,并且字段為int類

型默認(rèn)值為0。還注意到為datasetResource添加了$maxSumString的參數(shù),其值為:

'、資源工D:資源數(shù)量;〃格式組成的字符串,作用是在客戶端為資源分配的限制提供依據(jù)。

既然字段是動(dòng)態(tài)生成的那么向dataset中添加數(shù)據(jù)是不是很困難呢?通常不會(huì)很困

難,因?yàn)樽侄问歉鶕?jù)業(yè)務(wù)動(dòng)態(tài)添加的,數(shù)據(jù)也是根據(jù)業(yè)務(wù)填充的,由于來源于相同的依據(jù),

所以并不會(huì)有很大的阻力,圖1.9是向datasetResource填充正確數(shù)據(jù)的完整代碼,

由于在這個(gè)場(chǎng)景中不能一次給予datasetResource正確的記錄,所以使用了一個(gè)小技巧,

利用HashMap為datasetResource記錄建立ID的索弓I。

protectedvoiddoLoadData(ViewDatasetdataset)throwsException{

super.doLoadData(dataset);

if(this.getState()==ViewModel.STATE_VIEW&&

dataset.getld().equals("datasetResource")){

//01.檢驗(yàn)groupby

靈活使用dorado5v1.0

Stringgroupby=DoradoContext.getContext().

getParameter(ngroupbyH);

if(null==groupby||"H.equals(groupby)){

thrownewException("請(qǐng)?jiān)趗rl后添加groupby參數(shù),”+

“例如:?groupby=fruitn);

)

//@2.向datasetResource中添力口初始化的記錄,并構(gòu)造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)可以將存儲(chǔ)在數(shù)據(jù)庫(kù)中的資源分配信息加載到Dataset中了,服

務(wù)器端的工作已經(jīng)結(jié)束。對(duì)頁(yè)面和組件的展現(xiàn)形式需要通過客戶端的JavaScript控制,

在介紹客戶端的代碼之前,現(xiàn)看一下該視圖模型的配置信息,如圖1.10。

Outline:-StandardView'IRotatedViewi~MeraedView

*7*view

PropertytableResource

5Datasets

confirmCancel

〈£■ifadatasetResource

?MasterLlnkconfirmDelete

idcjFieldsdatasetdatasetResource

Si。keyeditable

電國(guó)&namefixedColumn

+」ParametersifooterHelght

,:「PropertiesheaderHeight

SOControlsheight300

七曲黨國(guó)賽

highlightselection

日name

idtableResource

t-'QcmdSave

Ignored

3Datasetinfos

-datasetResourceleft

三:ParameterslocalSort

?groupbymaxRow

劍btSavereadonlytrue

見btEditrowDraggable

OPropertiesrowHeight

圖1.10資源分配視圖模型的配置信息

由圖1?9和圖1.10可見,先定義了datasetResource的key與name字段,其

他的字段是服務(wù)器端動(dòng)態(tài)生成的。tableResource綁定了datasetResource但只定義

了name歹U,那么其他的列是什么時(shí)候在哪里怎樣添加的呢?

答:是在客戶端視圖模型的onDatasetsPrepared(ViewModel)事件中最終調(diào)用

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.成功保存后的動(dòng)作

EventManager.addDoradoEvent(cmdSave,"onSuccess**,

function(command){

Base,DataTabletoReadState(tableResource);

btSave.disabled=true;

btEdit.disabled=false;

});

圖1.11onDatasetsPrepared(ViewModel)事件完整代碼

圖1.11中的代碼非常簡(jiǎn)單,只做了兩件事情:

第一件:為了完成業(yè)務(wù)功能進(jìn)行的初始化工作。

第二件:通過EventManager為DoradoElement添力II事件。

當(dāng)查看該視圖模型的源文件時(shí),你會(huì)發(fā)現(xiàn)我們并沒有通過studio為組件和Dataset

添加任何事件,事實(shí)上這些事件是使用JavaScript禾!]用EventManager添力口的。這種

做法的意義遠(yuǎn)大于EventManager的功能,詳細(xì)內(nèi)容我們將在事例二中介紹,并且引入一

種叫做VBC的面向業(yè)務(wù)的客戶端編碼風(fēng)格。

現(xiàn)在需要說明客戶端代碼的思路了,還記得我們?cè)诜?wù)器端為datasetResource添

加一個(gè)叫做$maxSumString的參數(shù)嗎?里面記錄著每種資源可分配的數(shù)量。在客戶端我們

就會(huì)使用它了,通過調(diào)用Base.initFieldMaxSum(baseDataset);將資源可分配數(shù)量

信息記錄在對(duì)應(yīng)字段的maxSum屬性上;通過調(diào)用Base.initFieldSum(baseDataset);

將資源已分配數(shù)量記錄在字段的sum屬性上;這兩個(gè)信息通過DataTable的

onFooterRefresh事件顯示在footer上,對(duì)資源分配的限制是通過

datasetResource的beforeChange監(jiān)視的。

DataTable的footer的用法

在圖1.2中我們看到了DataTable的footer的效果,近距離觀看如下圖。

巳分配/總量5/54/41/33/60/2

如果您想使用DataTable的footer,只需要將DataTable的showFooter屬性

設(shè)置為true。

sh^F^ote?k

使用footer顯示什么內(nèi)容可以通過onFooterRefresh事件來實(shí)現(xiàn)。

Ige1.'inu

巳OControls

-ffltableResourcefunctiononFooterRefresh(column,cell,value){

nametell.innerHTML="已分配/總量”;|

由于dorado提供了事件編程接口,所以可以在footer上實(shí)現(xiàn)動(dòng)態(tài)的復(fù)雜的顯示效

果,在該事例的每個(gè)資源對(duì)應(yīng)的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事件維護(hù)業(yè)務(wù)約束

該事件的關(guān)鍵特性是:如果返回值為AbortException或DoradoException可以

阻止用戶對(duì)Dataset中值的修改,如果返回的是AbortException則系統(tǒng)會(huì)終止默認(rèn)的

后續(xù)操作,如果返回的是DoradoException系統(tǒng)會(huì)首先給出提示信息然后終止默認(rèn)操作。

圖1.12中的Base.updateFieldSum就是datasetResource的beforeChange的

事件句柄,如果用戶分配資源的數(shù)量大于資源總量會(huì)返回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)達(dá)至U了最大數(shù)量,不能再4個(gè)西己了”);

}else{

Base.setFieldSum(null,field,resultSum);

}

break;

default:

alert(nother.value="+value);

)

}

圖1.12通過Dataset的beforeChange事件維護(hù)業(yè)務(wù)約束

代碼清單

到目前為止我們已經(jīng)對(duì)客戶端的代碼總體分析了?次,下面是詳細(xì)代碼,也許你還會(huì)從

中看出幾分珠磯,見圖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事件中調(diào)用的,僅僅用至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)達(dá)至!j了最大數(shù)量,不能再分配了”);

}else{

Base.setFieldSum(null,field,resultSum);

}

break;

default:

alert(nother.value="+value);

}

|

/**

*初始化datatable.column

*@paramDatasetdataset

*@paramDataTabledatatable

*注:根據(jù)dataset給datatable添加column,并設(shè)置column的相關(guān)屬性和事件

*/

Base.initDatatableColumn=function(datasetzdatatable){

varfieldcount=dataset.getFieldCoun

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論