Asp.Net Ajax 学习笔记25 利用Microsoft AJAX Library开发客户端组件(下)
2008-01-24 01:23
981 查看
这次课程的首先将$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.initializeBase(this);
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)
...{
//得到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模型没有示例。
$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.initializeBase(this);
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)
...{
//得到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模型没有示例。
相关文章推荐
- Asp.Net Ajax 学习笔记24 利用Microsoft AJAX Library开发客户端组件(中)
- Asp.Net Ajax 学习笔记23 利用Microsoft AJAX Library开发客户端组件(上)
- ASP.NET AJAX(13)__利用Microsoft AJAX Library开发客户端组件
- 学习 ASP.NET AJAX深入浅出系列课程(21):利用Microsoft AJAX Library开发客户端组建(上)(Level 300)
- Asp.Net Ajax 学习笔记12 基于Microsoft AJAX Library扩展客户端组件
- (学习Asp.net Ajax笔记一)使用 Microsoft AJAX Library 创建自定义客户端脚本之一
- Asp.Net Ajax 学习笔记22 使用Microsoft Ajax Library中的浏览器兼容功能
- Asp.Net Ajax 学习笔记11 Microsoft AJAX Library中的面向对象类型系统
- ASP.NET AJAX(7)_Microsoft AJAX Library扩展客户端组件
- Asp.Net Ajax 学习笔记13 Microsoft AJAX Library中异步通信层(摘自网络)
- Asp.Net Ajax 学习笔记13 Microsoft AJAX Library中异步通信层使用
- Asp.Net Ajax 学习笔记9 JavaScript的原生类型以及Microsoft AJAX Library的相关扩展(上)
- Asp.Net Ajax 学习笔记10 JavaScript的原生类型以及Microsoft AJAX Library的相关扩展(下)
- Asp.Net Ajax 学习笔记14 扩展Microsoft AJAX Library的异步通信层
- ASP.NET 3.5核心编程学习笔记(52):Microsoft AJAX JavaScript类库
- ASP.NET AJAX客户端编程之旅(四)——以组件的思想开发Ajax应用:客户端组件初探
- Asp.net控件开发学习笔记-Asp.net客户端状态管理
- Microsoft AJAX Library Cheat Sheet——ASP.NET AJAX客户端框架的快速参考系列(翻译全部完成)
- ASP.NET AJAX客户端编程之旅(四)——以组件的思想开发Ajax应用:客户端组件初探
- ASP.NET AJAX(网页框架、客户端组件开发)