注册通行证 用户名 密码
  • 文章投稿
  • 博客
  • 论坛
  • 设为首页
  • 加入收藏
jztop.com网络技术
  • 首页
  • | iT新闻
  • | 操作系统
  • | 组网建网
  • | 网络安全
  • | 程序开发
  • | 办公一族
  • | 工具软件
  • | 网页制作
  • | 多媒体制作
  • | 网吧技术
  • | 服务器
  • | 专题教程
Vista | 软件评测 | 系统备份 | 优化 | 进程 | 聊天 | 病毒 | Linux | 黑客 | 防火墙 | 数据库 | Web开发 | Java | Word | 游戏 | 32位开发 | 移动开发
当前位置:首页 > 程序开发 > 数据库 > Oracle 内容正文:Atlas编程揭密之数据绑定

Atlas编程揭密之数据绑定

发布时间:2006-04-05 11:48:56 来源:博客园 网友评论 0 条
  Atlas架构提供了一种比ASP.NET中数据绑定(data binding)强大得多的客户端绑定模型。这种模型异常灵活,甚至有些类似WPF(Windows Presentation Foundation)中的绑定模型。Atlas提供的绑定模型允许您将某对象的任意一个属性绑定到另外一个对象的任意一个属性上。它不单单可以应用于数据绑定,甚至可以将某个控件的样式绑定到另外一个控件上。这样使得在Atlas中将一切关联起来变成可能。

  在本文中,我将尝试分析一些Atlas实现代码来解释Atlas是如何完成Binding的。

  首先让我们察看一小段应用Atlas Binding的代码。这里将一个textbox的text属性和一个select list的selectedValue属性绑定起来。无论你改变其中的哪个,在另一个上面都会有立刻得到体现。

  HTML和ASPX,定义textbox和select list。(注意必须声明一个ScriptManager服务器端对象,以引入Atlas必须的JavaScript文件。)

<atlas:ScriptManagerID="ScriptManager1"runat="server"/>
<div>
Inputanintegerfrom1to5.<br/>
<inputid="myTextBox"type="text"/><br/>
Selectanitem.<br/>
<selectid="mySelect">
<optionvalue="1">value1</option>
<optionvalue="2">value2</option>
<optionvalue="3">value3</option>
<optionvalue="4">value4</option>
<optionvalue="5">value5</option>
</select>
</div>

  Atlas脚本,将上面两个HTML控件“升级”成Atlas控件。

<pagexmlns:script="http://schemas.microsoft.com/xml-script/2005">
<references>
</references>
<components>
<textBoxid="myTextBox">
<bindings>
<bindingdataContext="mySelect"dataPath="selectedValue"property="text"direction="InOut"/>
</bindings>
</textBox>
<selectid="mySelect"/>
</components>
</page>

  如上所示,我们只需要书写一小段简单的代码即可实现需要的绑定功能。

  Atlas是如何实现这些的呢?首先,Atlas需要有一种途径来监听绑定控件的绑定属性的变化(除非你不需要Atlas提供的自动绑定功能)。在Atlas.js中定义了一个名为Sys.INotifyPropertyChanged的接口,类似.NET中提供的一样。对象可以实现这个接口以期让别的对象监听到自己的属性值的变化。Atlas中所有组件的基类,Sys.Component,实现了这个接口。Sys.Component同样提供一个方法raisePropertyChanged(propertyName),这个方法应该在每个属性的setter中被调用以发出INotifyPropertyChanged.propertyChanged事件。

  目前为止,我们可以看一下Atlas控件中textbox的具体实现。看看textbox中是如何在相应的HTML事件发出时同样发出propertyChanged事件的。

var_text;
var_changeHandler;

this.get_text=function(){
returnthis.element.value;
}

this.set_text=function(value){
if(this.element.value!=value){
this.element.value=value;
this.raisePropertyChanged('text');
}
}

this.initialize=function(){
Sys.UI.TextBox.callBaseMethod(this,'initialize');

_text=this.element.value;

_changeHandler=Function.createDelegate(this,this._onChanged);
this.element.attachEvent('onchange',_changeHandler);

_keyPressHandler=Function.createDelegate(this,this._onKeyPress);
this.element.attachEvent('onkeypress',_keyPressHandler);
}

this._onChanged=function(){
if(this.element.value!=_text){
_text=this.element.value;
this.raisePropertyChanged('text');
}
}

  可以看到,当text属性改变时,Atlas发出了propertyChanged事件,这就使绑定到这个属性成为可能。

  而后Atlas的绑定模型捕获到了这个事件,再根据binding声明查找出与其相关的目的对象以及相应的属性,并调用这个属性的Setter来实现目的对象属性的变化。

  如果源对象(source object)实现了INotifyPropertyChanged接口,并且改变的属性就是dataPath 中指定的属性,同时direction 设定为In或者InOut,Atlas绑定将通过分析引入(incoming)的binding来处理propertyChanged事件(参考下面将要介绍的evaluateIn()方法)。

  类似的,如果目的对象(target object)实现了INotifyPropertyChanged接口,并且改变的属性就是property中指定的属性,同时direction 设定为Out或者InOut,Atlas绑定将通过分析流出(outgoing)的binding来处理propertyChanged事件(参考下面将要介绍的evaluateOut()方法)。

  接下来让我们察看binding实现代码中的的公有方法和属性来分析一下Atlas绑定的核心实现。在这里没有必要列出涉及绑定的全部代码,如果您感兴趣,可以用关键词Sys.BindingBase和Sys.Binding 在Atlas.js文件中进行搜索。首先是Sys.BindingBase提供的方法和属性。

  • 属性automatic:指定当源对象的相应属性变化时(对于In和InOut),或者目的对象的相应属性变化时(对于Out和InOut),绑定是否将被自动执行。这个属性默认会被置为true。当然如果你需要完全控制绑定的开始时机时也可以设定为false。例如,某些情况下你决定在一个AJAX请求成功返回的时候才开始绑定数据源与显示控件,以确保显示控件真正绑定到了一些数据,这时你需要显示的调用binding的evaluate()方法以开始绑定。

  • 属性dataContext:指定拥有待绑定属性的对象。如果不指定的话,Atlas binding将调用包含它的父控件的dataContext属性代替。控件可以通过返回设定的dataContext或是按照默认返回其父控件的dataContext来实现这个属性。例如,某个ListView控件可以在其创建ListView Item时设定它的dataContext为一个DataRow对象,以实现绑定。

  • 属性dataPath:指定需要绑定的源对象的属性。Atlas binding还允许绑定一个嵌套的属性,类似:sourceObjectProperty.nestedProperty.nestedNestedProperty。源代码中可以看出Atlas能自动为你转化并运行这些代码。dataPath属性的默认值为空,也就是Atlas会绑定这个对象本身。

  • 属性property:指定需要绑定的目标对象的属性。你应该总是指定这个属性,否则这个绑定就没有任何意义。

  • 属性propertyKey:有时候我们可能需要绑定到某个对象的嵌套属性上。比如,如果需要绑定到style的属性color,我们可以指定property属性为style,并指定propertyKey属性为color。

  • 属性transformerArgument:传递给Atlas transformer的参数,只有设定transform时才会用到。

  • 事件transform:这个事件允许在绑定时指定一个transformer。当你需要在绑定的时候对数据做以处理时,transformer将会是个很好的选择。例如,如果你希望显示一个布尔值为Yes/No而不是默认的true/false,那么就应该使用一个自定义的transformer。Atlas同时提供了一些内建的transformer,例如Add,Multiply以及Compare等。

  • 方法evaluateIn:处理引入的binding。如果direction属性设置成为In或者InOut,该方法将取得源对象的属性的值(根据binding中设定的dataContext以及dataPath属性),并调用目标对象相应属性的Setter。这也就是Atlas中实现binding的核心部分。
    Sys.Binding(也在Atlas.js中)中也有一些重要的方法/属性:

  • 属性direction:指定希望监听的属性变化的方向。可以设定为In,Out或者InOut。默认值为In。

  • 方法evaluateOut:与基类中的方法evaluateIn类似,但是以相反的方向执行。当然,需要将directiton属性设定为Out或者InOut。 希望这些解释能够让您对Atlas的“神奇的”绑定有一些更深入的理解。欢迎留言探讨。
  • 相关文章
    • VC++内部COM插件的编程实现
    • Eclipse插件编程之Implementors
    • Atlas应用程序的调试技巧
    • 组件编程之TypeConverterAttribute
    • PHP编程技巧:看实例学正则表达式
    【评论】【收藏本文】【打印】【关闭】
    上一篇文章:你的代码真的很健壮吗
    下一篇文章:剖析AJAX成为“时尚”的十大主要理由
    讨论区
    查看
    已有 0 位对此新闻感兴趣的网友发表了看法
    匿名发表
    注册通行证 登陆
    图文阅读推荐
    Atlas快速入门之实战Atlas
    Atlas快速入门之实战Atlas
    .net页面间的参数传递简单实例
    .net页面间的参数传递简单实例
    推荐阅讯
    • 专访菠萝网创始人:盲目做Web2.0不可取
    • J2ME中多线程网络连接编程的分析
    • OpenGL编程轻松入门之使用颜色
    • Oracle数据库游标使用大全
    • Microsoft SQL Server 7.0安全问题
    • 为什么要用UML建模之面向对象建模
    • Ruby程序快速入门之数据结构
    • 封装的变化之不断变化的需求
    • 开源Eclipse风头正劲 Sun态度若明若暗
    • 程序员建立商业意识之玩技术与利用技术
    阅读排行
    • 1..net页面间的参数传递简单实例
    • 2.VC++与Matlab混合编程之引擎操作详解
    • 3.Oracle数据库数据对象分析
    • 4.Eclipse3.2+Tomcat5.5.17+Oracle9配置
    • 5.Oracle数据库中索引的维护
    • 6.在Oracle的网络结构中解决连接问题
    • 7.Oracle数据安全面面观
    • 8.Oracle数据库的ORA-00257故障解决过程
    • 9.Oracle数据库备份与恢复的三种方法
    • 10.Oracle与SQL Server在企业应用中的比较
    专题教程
    • 大话G游 专题:手机病毒揭密
    • ARP攻击防范与解决方案 路由故障处理手册
    • Picasa中文版_Picasa教程 专题:清除流氓软件
    • Firefox专题 seo搜索引擎优化专区
    • 重装Windows必知的事情 装机之必备软件大行动
    病毒专杀栏
    • 杀毒软件反被病毒杀 连"救命"都不能喊
    • 金山ARP防火墙
    • 还原卡神话破灭“机器狗”病毒来势汹汹
    • cctv经济半小时:你的手机现在安全吗?
    • 新挂马方式开始流行 ARP挂马称雄局域网
    • 木马和病毒清除的通用解法
    • IP地址不再冲突 查找ARP攻击者元凶
    • 教你几招识别和防御Web网页木马
    • 分析:封杀BT只是暂时的止痛药
    • QQ爆危险漏洞,“QQ游戏邀请大盗”邀请你玩病
    关于我们 | 诚聘英才 | 联系我们 | 版权声明 | 网站大事 | 网站地图 | 意见建议
    CopyRight 2005-2007 Jztop.Com 版权所有 未经许可 请勿转载