读GI源码、学JS编程——JavaScript中的事件实现(完整版)。
SOA这盘菜被个大厂商炒了又炒,WebService渐渐成为标准的传输方式,Soap被越来越多的人认识。这个时候人们发现JavaScript能够调用WebService,于是有人开始试水了。不得不说用Javascipt完全可以作为为UI层的骨架,UI层的逻辑开发对于Javascipt简直就是得心应手,显示更不用说,传输用WebService,哈哈,不再需要那么多WebForm控件,让C#去更多的关注如何实现业务去吧。
但对于JavaScript很多人不是很了解,尤其是对于大型RIA程序来说,一堆堆的脚本对于习惯了C#的程序员简直就是恶梦。就像每个人当初学C#一样,Petshop是一门不可多得的教材,当TIBCO宣布GI开源的时候,人们发现这才是JavaScript中最好最重量级的教材。我想一起与大家学习GI中值得学习的部分,学习Javascipt怎么在大型RIA中发挥作用。
再简单介绍一下GI_Builder,GI_Builder是TIBCO公司开发的一套基于Javascipt开发的用开发开JavaScript的IDE,当然也包括一套Framework,类似于VS2005,只需要你拖拖拽拽就能实现页面上的,实现很多大家梦寐以求的Javascipt端的控件,Tab,Tree,Grid,甚至于更佳神奇的在Firefox下用SVG比表示,在IE下用VML表示的Chart。相信这些东西如何实现肯定谁都非常感兴趣。
好吧我们先从写基础的开始,看看大程序为了实现整个功能的运行都做了些什么。大多数人都知道,Ajax程序是以事件驱动为基础的,而实现一个事件的注册和广播也是很多框架中必要的设计,GI中是如何实现事件的机制的呢。
我们先来看这样一段伪事件的实现:
{
//声明事件
this.onAdd=function(){return false;}
this.Add=function(a,b)
{
var c=a+b;
//执行事件
if(typeof(this.onAdd)=="function")this.onAdd();
return c;
}
}
ClassB=function()
{
this.AlertAdd=function()
{
this; //这里让大家看点东西,嘿嘿
alert("Add");
}
this.Test=function()
{
var a=new ClassA();
//绑定事件
a.onAdd=this.AlertAdd;
a.Add(1,1);
}
}
于是乎Asp.net Ajax中出现了这样的一个东西:
{
return function(){return method.apply(instance,arguments);};
}
这个东东的确好用,我经常用他也。一个apply成为了我们救星,可是又一个问题出现了我们在.net中可以一个劲儿的+=然后再+=,最后全都执行了,怎么一下子搞那么多事件。如何才能让Javascript中也实现这样的复杂机制呢?要想知道GI中如何实现,且听下回分解。
太困了,明天接着写吧,还要上班、上班呢啊 。
---------------------------------------------------------------------12小时后----------------------------------------------------------------------------
在JSX30.js中有这样的一些代码:
然后当然就是事件的注册了,事件的注册需要什么?需要知道注册到什么事件上就是onXXX,还需要知道绑定到哪个方法上,于是乎evtPub._subscribe = function(strSubject, objTarget, strMethod) 方法出现了
evtPub._subscribe = function(strSubject, objTarget, strMethod) {
if (this._evtpubreg == null)
/* @jsxobf-clobber */
this._evtpubreg = {};
var list = this._evtpubreg[strSubject];
if (list == null)
list = this._evtpubreg[strSubject] = [];
list.push([objTarget, strMethod]);
};
看这些参数,首先strSubject就是我们所说的onXXX,关于后面的两个参数是什么,我们来看看事件是如何执行的再说。
来广播了:evtPub._publish = function(objEvent) {
if (this._evtpubreg != null) {
var list = this._evtpubreg[objEvent.subject];
if (list) {
if (objEvent.target == null)
objEvent.target = this;
list = list.concat(); // defensive copy
for (var i = 0; i < list.length; i++) {
if (typeof(list[i][0]) == "function")
list[i][0](objEvent);
else
list[i][0][list[i][1]](objEvent);
}
}
}
};
先声明一下,objEvent是GI中自己实现的一个Event类,里面有个属性subject就是那个onXXX。好了,看这个方法中,在执行事件之前做了个判断也就是说objTarget会有两种形式Object和function所以说他注册的话也会有两种方法咯:
objApp._queue._subscribe("qstart", objApp._progress, "onQueueStart");
objApp._queue._subscribe("qdone", function() {…});
当然第一种方式是主要的使用方式,objTarget是调用方法所属的引用,strMethod是要调用的方法
另外,还需要看以下这个list = list.concat();我一直都不太明白,我猜想这个是为了线程安全的,在publish的时候如果再注销这个事件就会发生问题。还请高人指点……
最后当然是事件的注销了:evtPub._unsubscribe = function(objTarget) {
if (this._evtpubreg != null) {
for (var subject in this._evtpubreg) {
var list = this._evtpubreg[subject];
for (var i = 0; i < list.length; i++) {
if (list[i] == objTarget)
list.splice(i--, 1);
}
}
}
};
/* @jsxobf-clobber */
evtPub._evtcleanup = function(objEvent) {
delete this._evtpubreg;
};
/* @jsxobf-clobber */
evtPub._import = function(objTarget) {
objTarget._subscribe = this._subscribe;
objTarget._unsubscribe = this._unsubscribe;
objTarget._publish = this._publish;
objTarget._evtcleanup = this._evtcleanup;
};
注销,值得一提的就是import方法,这是什么?继承-_-b….
也就是说在你的类里面需要执行以下import的方法,然后你的类里面就这些方法就都用了,不就是个call()的功能-_-b…
相关推荐
如果要编译Java代码是不行的,而maven-compiler-plugin这个是Apache官方提供的Maven编译Java源码的功能插件,我们在项目中经常使用到,也就是我们平时使用的mvn compile指令就是通过该插件实现的。maven-compiler-...
.net版本实现远程控制关闭与重启计算机实例源码-r5Gi.rar.net版本实现远程控制关闭与重启计算机实例源码-r5Gi.rar
----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...
g: 全局匹配 i: 忽略大小写 gi: 全局匹配 + 忽略大小写
FPGA可编程逻辑器件芯片XC3S100E-5FG484GI中文规格书.docx
FPGA可编程逻辑器件芯片XC3S100E-5FG400GI中文规格书.docx
FPGA可编程逻辑器件芯片XC3S100E-5FG320GI中文规格书.docx
FPGA可编程逻辑器件芯片XC3S100E-4FG484GI中文规格书.docx
FPGA可编程逻辑器件芯片XC3S100E-5FG484GI中文规格书.pdf
FPGA可编程逻辑器件芯片XC3S100E-5FG400GI中文规格书.pdf
FPGA可编程逻辑器件芯片XC3S100E-5FG320GI中文规格书.pdf
FPGA可编程逻辑器件芯片XC3S100E-4FG484GI中文规格书.pdf
NULL 博文链接:https://vampire1126.iteye.com/blog/1113319
gi文件,参照文章说明操作,Ubuntu19.04 gi文件,参照文章说明操作,Ubuntu19.04
ddos攻击:分布式拒绝服务攻击,就是利用大量肉鸡或伪造IP,发起大量的服务器请求,最后导致服务器瘫痪的攻击。 cc攻击:类似于ddos攻击,...—————————— 1. 下载lua-nginx-module wget https://github.
先卸载旧版 yum remove git 添加新源后安装新版(软件包 git2u 已经被 git216 取代) ...yum install -y git216 ...————————————————————- 参考https://my.oschina.net/tonystark/blog/1920556 #
Advances in Real-Time Voxel-Based GI高级渲染.pdf
我们采用的架构图如下:引用——– ———- ————- ——— ————| 客户端 | ===> |负载均衡器| ===> |反向代理/缓存| ===> |WEB服务器| ===> |数据库服务器|——– ———- ————- ——— ————N
——————————————————————————– 后向引用 正则表达式一个最重要的特性就是将匹配成功的模式的某部分进行存储供以后使用这一能力。请回想一下,对一个正则表达式模式或部分模式两边添加圆...