常用技巧和API

2024-03-07 18:37 更新

通過控件ID獲得控件的方法

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");

掌握對象的tags屬性

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的get和set中更多使用技巧

綜合前面我們對View的this方法的了解,我們總結(jié)一共有四種用法: view.get("title") //讀取View自身的虛擬屬性view.get("#buttonOK") //獲取View中的某一個對象view.get("^foo") //根據(jù)tags機制獲取View中的一批對象view.get("@DataTypeProduct") //根據(jù)名稱獲得某個DataType

$url()

作為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前綴。

$DomUtils.xCreate()

對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'
            }
        ]
    });

$log()

如果你還使用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)簽的效果:

.each()

在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ù)。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號