這次課程的首先將$create方法的詳細簽名描述了一遍。
$create( type, propertIEs, events,references, element);
那麼什麼時references呢?references是一個字典,保存了對象屬性與其它對象的關系,key是屬性名,value是其他對象id。保證在initialize方法被調用時屬性已經被設置為所需對象,即使調用$create方法時其他對象還沒有創建。這個意思就是說,可以在create時,創建本組件的一個屬性,這個屬性保存的是其他對象的ID(可以說是引用)。在創建對象的propertIEs和events時,可以使用JSon字符串的形式來描述。在下面的例子將會演示。
我們將演示一個復合控件, 復合控件主要會涉及到Control模型中的以下兩個方法:
- raiseBubbleEvent(source, args):由子控件調用,將觸發的事件向父控件傳遞
- onBubbleEvent(source, args):父控件重寫該方法,用於接受子控件向上傳遞過來的事件
這兩個方法的主要作用是降低父控件和子控件之間的耦合關系,例如子控件不需要知道它的父控件是誰。
// JScript 文件
Type.registerNamespace("Demo");
//這是一個Button類,他代表一個子元素
Demo.Button = function(element)
...{
Demo.Button.initializeBase(this, [element]);
this._context = null;
this._onClickHandler = null;
}
Demo.Button.prototype =
...{
initialize : function()
...{
Demo.Button.callBaseMethod(this, "initialize");
//創建一個onClickHandler的函數事件,將他根onClick函數綁定
//在一起,那麼調用onClickHandler就是調用onClick函數
this._onClickHandler = Function.createDelegate(this,
this._onClick);
//給Button組件裡的元素就是是DOM元素裡的button的click事件
//綁定在一起,實際上就是綁定了OnClick函數.這裡為什麼不直接
//綁定OnClick函數,因為我們需要通過createDelegate將當前this
//作為this上下文傳遞到onClick函數,如果直接綁定,當前this上
//下文就是DOM元素裡的button
$addHandler(this.get_element(), "click",
this._onClickHandler);
},
dispose : function()
...{
this._onClickHandler = null;
$clearHandlers(this.get_element());
Demo.Button.callBaseMethod(this, "dispose");
},
_onClick : function(e)
...{
//將context作為args的參數,傳遞到外部。
var eventArgs = new Demo.ButtonClickEventArgs(this._context);
//這裡可以不用這個函數,直接調用raiseBubbleEvent
this.raiseClick(eventArgs);
},
raiseClick : function(args)
...{
//向父控件傳遞事件
this.raiseBubbleEvent(this, args);
},
get_context : function()
...{
return this._context;
},
set_context : function(value)
...{
this._context = value;
}
}
Demo.Button.registerClass("Demo.Button", Sys.UI.Control);
Demo.ButtonClickEventArgs = function(context)
...{
Demo.ButtonClickEventArgs.initial
this._context = context;
}
Demo.ButtonClickEventArgs.prototype =
...{
get_context : function()
...{
return this._context;
}
}
Demo.ButtonClickEventArgs.registerClass("Demo.ButtonClickEventArgs", Sys.EventArgs);
Demo.ButtonList = function(element)
...{
Demo.ButtonList.initializeBase(this, [element]);
this._itemDataList = null;
}
Demo.ButtonList.prototype =
...{
initialize : function()
...{
Demo.ButtonList.callBaseMethod(this, "initialize");
for(var i = 0; i < this._itemDataList.length; i++)
...{
this._createNewButton(this._itemDataList[i]);
}
},
_createNewButton : function(data)
...{
//創建一個button的DOM元素
var buttonElement = document.createElement("input");
buttonElement.type = "button";
buttonElement.value = data.text;
//當前容器將button放置在本容器中。
this.get_element().appendChild(buttonElement);
//使用JSon字符串的形式來初始化Demo.Button組件的屬性,
//注意,設置屬性沒有使用_context和set_context,直接使用的
//context,這裡系統自動轉換
$create(
Demo.Button,
...{
"context" : data.context,
"parent" : this
},
null,
null,
buttonElement
);
},
get_itemDataList : function()
...{
return this._itemDataList;
},
set_itemDataList : function(value)
...{
this._itemDataList = value;
},
//相當於派生類重寫onBubbleEvent函數,當容器裡的控件拋出
//raiseBubbleEvent事件時,這個函數將自動調用
&onBubbleEvent : function(source, e)
...{
//調用raiseItemClick函數
this.raiseItemClick(e);
//返回true表示,事件不會再向上層的容器控件傳遞
return true;
},
add_itemClick : function(handler)
...{
this.get_events().addHandler("itemClick", handler);
},
remove_itemClick : function(handler)
...{
this.get_events().removeHandler("itemClick", handler);
},
raiseItemClick : function(args)
&nbs
//得到itemClick事件的事件處理器
var handler = this.get_events().getHandler("itemClick");
if(handler)
...{
//調用外部的定義的itemClick的事件處理器
handler(this, args);
}
}
}
Demo.ButtonList.registerClass("Demo.ButtonList", Sys.UI.Control);
這是容器類和子類的定義。
<div id="buttonList">
</div>
這是容器element的定義
<script language="Javascript" type="text/Javascript">
//利用Application初始化ButtonList控件
Sys.Application.add_init(
function()
...{
//定一個數組,作為ButtonList的itemDataList屬性
var dataList =
[
...{
text : "Item1",
context : "Item1 has been clicked"
},
...{
text : "Item2",
context : "Item2 has been clicked"
},
...{
text : "Item3",
context : "Item3 has been clicked"
}
];
$create(
Demo.ButtonList,
...{
"itemDataList" : dataList
},
//定義itemClick事件的事件處理器
...{
"itemClick" : onItemClick
},
null,
$get("buttonList")
);
}
);
function onItemClick(sender, args)
...{
alert(args.get_context());
}
</script>
Behavior模型是 另一種可視化組件模型,繼承於Sys.UI.Behavior。 Control包裝DOM元素,Behavior為DOM元
素提供功能(效果, etc)。 一個DOM元素只能由一個Control來包裝,但是可以由多個Behavior進行“裝飾”。
Behavior成員• 與Component組件相比唯一增加的屬性是name屬性。 由於一個DOM元素上可以添加多個Behavior,因此如果要通過元素獲得Behavior對象就要通過name屬性的值。 通過$get(“eleId”)["name_of_behavior"]來設置。Behavior模型沒有示例。