Dorado中不支持以全局變量的形式訪問控件,例如id為"buttonOK"的控件,我們在JS端不允許直接通過buttonOK.set("caption","OK");這種形式做操作,由于Dorado中采用了命名空間的做法,一個控件必須屬于一個視圖,而一個頁面可能有多個視圖,這樣可以很好的解決JS中全局變量名沖突的問題,在Dorado中我們推薦使用如下的方式獲取控件:
view.get("#buttonOK");
其中上面的代碼都是針對一個控件的某一個事件執(zhí)行的.如果get方法內(nèi)部不加"#",按照之前虛擬屬性的了解,我們就會知道view.get("buttonOK")這是表示訪問View對象的buttonOK屬性,而添加了#則表示要獲取其中的buttonOK控件。另外結(jié)合之前我們介紹的虛擬屬性迭代的特性,我們可以這樣使用:
view.get("#buttonOK.caption");//通過虛擬屬性的迭代,最終可以直接獲得buttonOK的caption屬性
除了上述方法之外,Dorado中還支持一種獲取控件的辦法:
view.id("buttonOK");
Dorado允許開發(fā)人員為對象定義一到多個的標(biāo)簽,然后利用標(biāo)簽批量的獲得一組對象以便于對他們進行統(tǒng)一的操作。
根據(jù)標(biāo)簽獲得一批對象的方法包括:
view.get("^foo") 今后推薦的方法。例如:view.set("^foo.disabled", true)view.tag("foo") 今后不再推薦。tags的用法,我們參看具體范例:?http://dorado.bstek.com/sample-center/com.bstek.dorado.sample.widget.Tags.d
如圖編號為19的按鈕,一共有三個標(biāo)簽:button表示按鈕, odd表示奇數(shù),green表示綠色(每個控件都可以為它定義不同的標(biāo)簽,其實就相當(dāng)與關(guān)鍵字)接下來就可以利用Dorado中的tags機制批量的查找按鈕。
選擇不同的按鈕可以看到具有相同標(biāo)簽且符合條件的所有按鈕都會處于按下的狀態(tài),其實代碼操作很簡單,在Dorado中通過如下的代碼實現(xiàn)tags的一批對象的選取:
view.get("^foo");
上面的代碼表示獲取所有標(biāo)簽為foo的一批對象,這批對象在Dorado中以O(shè)bjectGroup形式封裝,在Dorado中ObjectGroup允許你對一批對象做一個統(tǒng)一的設(shè)定,如:
view.set("^foo.disabled", true);//將所有標(biāo)簽為foo的控件對象的disabled屬性設(shè)置為false.
在上例中,如如果我們想找到所后的奇數(shù)按鈕,就可以通過:
view.set("^button").set("toggled", false);//為演示效果,讓所有按鈕恢復(fù)常態(tài)
view.set("^odd").set("toggled", true);//找到所有的標(biāo)簽為奇數(shù)的按鈕,并使其處于按下的狀態(tài)
同樣的如果想找到所有的偶數(shù)按鈕:
view.set("^button").set("toggled", false);//為演示效果,讓所有按鈕恢復(fù)常態(tài)
view.set("^odd").set("even", true);//找到所有的標(biāo)簽為偶數(shù)的按鈕,并使其處于按下的狀態(tài)
紅色按鈕:
view.set("^button").set("toggled", false);//為演示效果,讓所有按鈕恢復(fù)常態(tài)
view.set("^odd").set("red", true);//找到所有的標(biāo)簽為紅色的按鈕,并使其處于按下的狀態(tài)
綠色按鈕:
view.set("^button").set("toggled", false);//為演示效果,讓所有按鈕恢復(fù)常態(tài)
view.set("^odd").set("green", true);//找到所有的標(biāo)簽為綠色的按鈕,并使其處于按下的狀態(tài)
按下所有按鈕:
view.set("^button").set("toggled", true);
還原所有按鈕:
view.set("^button").set("toggled", false);
tags的操作在某些場景下能給我們帶來很多好處,如果一個頁面有十個按鈕,三、四中不同的編輯模式下,要求這些按鈕的disabled狀態(tài)不同,通常情況下我們會采用如下非常繁瑣的代碼:
if ("mode1"==type){
view.set("#button1.disabled", true);
view.set("#button2.disabled", false);
..
view.set("#button10.disabled", true);
}else if ("mode2"==type){
view.set("#button1.disabled", true);
view.set("#button2.disabled", true);
..
view.set("#button10.disabled", false);
}else if ("mode3"==type){
view.set("#button1.disabled", false);
view.set("#button2.disabled", true);
..
view.set("#button10.disabled", true);
}
而采用tags特性之后,我們只要給每個Button設(shè)置不同的tag,設(shè)置其中為"model1","model2","model3"中的一到多種,多個tag逗號隔開,之后JS代碼就可以非常簡潔了:
if ("mode1"==type){
view.set("^model1.disabled", true);
}
else if ("mode2"==type){
view.set("^model2.disabled", true);
}
else if ("mode3"==type){
view.set("^model1.disabled", true);
}
綜合前面我們對View的this方法的了解,我們總結(jié)一共有四種用法: view.get("title") //讀取View自身的虛擬屬性view.get("#buttonOK") //獲取View中的某一個對象view.get("^foo") //根據(jù)tags機制獲取View中的一批對象view.get("@DataTypeProduct") //根據(jù)名稱獲得某個DataType
作為WEB程序員我們都知道:在我們定義一個URL的時候,如果我們定義一個字符串,其開頭以"/"開始(包括Dorado開發(fā)當(dāng)中也會接觸到的,如button的icon也是一個url字符串),則表示從端口號開始計算,而不是以webapp的名字開頭,而在很多場景下我們還需要webapp的名字,為了解決這個問題,很多系統(tǒng)都將這個webapp的名字作為JS變量輸出到客戶端,然后在客戶端拼寫最終的URL。這個做過這方面開發(fā)的人都大概了解這個處理過程。在Dorado中如果我們的URl以應(yīng)用開頭,則我們只要以">"開頭就可以,對于這種URL,Dorado會自動的幫助你轉(zhuǎn)換為webapp開頭的URL,如: ">images/icon.gif"將轉(zhuǎn)換為"/appContextPath/images/icon.gif" 另外Dorado中還支持帶有skin>前綴的寫法,如:"skin>widget.css"將轉(zhuǎn)換為Dorado當(dāng)前當(dāng)前皮膚路徑下的widget.css的URL。因為skin是預(yù)設(shè)的URL前綴代表當(dāng)前皮膚的跟路徑。 今后還將會開放用戶自定義URL前綴。
對DHTML技術(shù)熟悉一些的人都知道,當(dāng)我們想要動態(tài)的創(chuàng)建一堆HTML元素,就需要不停的調(diào)用createElementById方法,并要設(shè)置好不同element之間的父子關(guān)系,如:
var button = document.createElement("INPUT");
button.context="Click Me";
button.style.border="1px black solid";
button.style.backgroundColor="white";
button.onclick=function(){
alert("Button clicked.");
}
或通過一段HTML腳本,賦值到一個具體的DOM對象的INNERHTML中:
var HTML= "<input type='button' style='border: 1px black solid; backgroundColor:white' >Click Me</input>"
oo.innerHTML = HTML;
上面的兩種方式一個是太繁瑣,一個采用HTML形式拼寫字符串不夠形式化,不容易維護。 Dorado更推薦大家以JSON的方式,利用xCreate方法創(chuàng)建DOM對象,根據(jù)以JSON形式定義的組件的模板信息快速的創(chuàng)建DOM元素:
$DomUtils.xCreate({
tagName: "button",
content: "Click Me",// 定義按鈕的標(biāo)題
style: {// 定義按鈕的style
border: "1px black solid",
backgroundColor: "white"
},
onclick: function() {// 定義onclick事件
alert("Button clicked.");
}
});
上例中,利用xCreate方法創(chuàng)建了一個Button對象,其中tagName是告訴xCreate方法要創(chuàng)建的對象類型為button,其context的內(nèi)容,以及style的設(shè)定和onclick的事件代碼,都比較簡單。 另外兩個范例:
//例子1:
container.addChild(new dorado.widget.RadioGroup().set('radioButtons',
[
new dorado.widget.RadioButton({
text: '測試一',
value: '1'
}),
new dorado.widget.RadioButton({
text: '測試二',
value: '2'
})
]
);
//例子2:
container.addChild(new dorado.widget.RadioGroup({
'radioButtons': [
{
text: '測試一',
value: '1'
},
{
text: '測試二',
value: '2'
}
]
});
如果你還使用alert,那么這是我們特別推薦的,使用過alert我們都知道它會帶來的幾個麻煩:
在循環(huán)體中,它會不停的彈出,讓你確認(rèn),然后才能繼續(xù)執(zhí)行有可能改變原來的邏輯,例如如果你的代碼和焦點有關(guān),alert會導(dǎo)致焦點的切換,讓你無法完全模擬原有情況現(xiàn)在我們除了使用瀏覽器提供的debug技術(shù)之外,我們還有了一種新的選擇$log。這是記錄調(diào)試日志的一個工具。日志結(jié)果可在頁面上按F2后看到如下頁面:
切換到script標(biāo)簽也,并在編輯框中輸入$log("AAAAAAAAA");并單擊Run按鈕執(zhí)行:
之后切換到Console標(biāo)簽頁就可以看到輸出的日志:
另外$log功能還支持多種級別的日志,例如error,info,warn等,如我們輸出一個error的信息:
運行后的Console標(biāo)簽的效果:
在JS循環(huán)代碼中,除了按照J(rèn)ava類似的寫法之外,each()是一種更值得推薦的方法。 Dorado擴展了標(biāo)準(zhǔn)的Array使之可支持each迭代,除Array之外Dorado提供的EntityList、KeyedList等集合特性的對象也支持each迭代。
var s = '';
['A', 'B', 'C'].each(function(item) {
s += item;
});
// 最終結(jié)果為s == "ABC"
如上的代碼左邊是一個數(shù)組,調(diào)用數(shù)組的each方法進行循環(huán),右側(cè)是一個回調(diào)函數(shù),其中我們注意到代碼中并沒有下標(biāo),所做的工作是在迭代循環(huán)中將字符拼裝起來。 另外each也支持循環(huán)的終止(如同for循環(huán)中的break功能),只要在方法的內(nèi)部寫:
return false;
如果沒有返回值或返回值為true,則循環(huán)就繼續(xù)。
更多建議: