這篇還是以會用到的ActionScript作介紹
提到的有
1.結合陣列和函式
2.function接受不定數量參數寫法
3.使用getChildByName()函式取得元件
4.動態設定元件屬性
1.結合陣列和函式
ActionScript 3 可以將陣列與函式搭配使用
範例程式碼:
var name:Array = ["Joe", "Jon", "Jay"];
name.foreach(showName);
function showName(element:*, index:int, array:Array){
trace("第" + index + "號的名字是" + element);
}
上述程式的element是表示元素的值,index就是...index嘛,最後的Array是傳進來的array
使用這種寫法就會自動的將參數以上面的方式輸入函式裡
另外以下的使用方法也可以參考:
....//與上述程式碼相同
function showName(element:*, index:int, array:Array){
//add ", " after elements
array[index] = element + ", ";
}
trace("名單有"+name + "以及其他人");
輸出結果會是經過改變的陣列內容
類似的處理還有map、filter、every、some方法
map範例:
var score:Array = [1, 2, 3];
var message:Array = score.map(addString);
function addString(element:*, index:int, array:Array){
return element + "分";
}
trace("score 是" + score);
trace("message 是" +message);
map與foreach方法的差別在於它具有回傳值
filter範例:
var num:Array = {1,2,3,4,5,6};
var evenList:Array = num.filter(isEven);
function isEven(element:*, index:int, array:Array):Boolean{
return element%2 == 0;
}
trace("偶數有" + evenList);
filter回傳的會是在判斷式裡是true的值,也就是 "偶數有2,4,6"
every、some的寫法類似filter,但這兩個回傳Boolean值
分別是對整體Array或部分Array作判斷
例如num.every(isEven); //回傳false,因為數列並不全為偶數
2.function接受不定數量參數寫法
這個部分在Java裡有類似的寫法,處理方式也差不多
範例:
function getDishes(plate:String, ...dishList:Array){
var dishes:String = dishList.join("、");
trace(plate + "有" + dishes);
}
getDishes("盒子裡有", "香腸", "空心菜", "炒麵");
不定量參數一定要放在最後面,並且只能用Array形別
3.使用getChildByName()函式取得元件
看到這個名稱就很容易想到 javascript 取得元件的寫法
在Flex裡整個mxml檔案內的元件配置也是呈現DOM階層式
mxml裡的Application標籤宣告即是一個節點
每個節點在執行期都等同於instance實體物件
實際上Flex還會再另外建立一個stage節點於Application上
stage位於整個結構的頂點,可以控制整個Application版面的配置
而這個getChildByName()函式使用方法如下:
this.getChildByName('a');
它會在整個階層架構中尋找名為a的元件
並將其以DisplayObject的型態回傳
4.動態設定元件屬性
程式範例:
public function setAttributeByName(uiIns:UIComponent,aName:String):void {
// 將物件Class-類別宣告轉成XML資料格式
var classInfo:XML = describeType(uiIns);
// 走訪XML中描述物件中所有的屬性
for each (var attr:XML in classInfo..accessor) {
//過濾如果屬性型態不是writeonly,也就是篩選出可讀寫的屬性
if (attr.@access != 'writeonly') {
if (attr.@name==aName) {
//以Associative array key的方式設定Instance的屬性
uiIns[attr.@name]=100;
}
}
}
}
程式會走訪XML中所有accessor節點並放入attr變數中
假使內容如同傳進來的aName變數
這個function會將指定的屬性設定成100
另外將accessor改換成method,則可以走訪物件資料中的method資料
程式範例:
public function callMethodByName(uiIns:UIComponent,mName:String):void {
//用陣列設定傳遞給方法中參數的值,請參考setVisible方法的參數格式
var args:Array=[false,false];
var classInfo:XML = describeType(uiIns);
// 走訪XML中描述物件中所有的方法
for each (var meth:XML in classInfo..method){
if (meth.@name==mName){
//以Associative array key的機制動態取得Instance的方法
//運用apply方法動態invoke被指定方法與傳遞參數
uiIns[mName].apply(uiIns, args);
}
}
}
這個範例可以做到動態呼叫元件的函式
沒有留言:
張貼留言