3.5.2 可选组件—— OpenLayers 的事件机制
目录
3.5.2
可选组件——
OpenLayers
的事件机制
在
OpenLayers
框架中,
OpenLayers.Events
是唯一与组件事件处理相关的类。无论是声明、注册还是触发事件,都是直接在
OpenLayers.Events
对象上。所以,如果要想让一个对象具有事件处理的能力,需要至少在其内部包含一个
OpenLayers.Events
对象。幸运的是,因为
OpenLayers.Control
类的构造函数已经自动在其内部包含了一个
OpenLayers.Event
对象,并将其保存到
events
字段当中。因此,编写控件的人不需要担心这一问题。
那么,如何编写控件才能让它拥有自己的事件呢?
首先,在控件类调用父类构造函数前,应该将自己支持的事件名称数组赋值给
this.EVENT_TYPES
字段。由于
OpenLayers.Control
类已经拥有了一些事件,因此,在赋值时不要忘记加上这些事件(框架是不会为你加入这些事件的)。比如,我们要在编写的控件类
OpenLayers.Control.MyControl
中加入事件“
MyEvent1
”和“
MyEvent2
”,那么,就需要在构造函数调用
OpenLayers.Control
类的构造函数之前加入如下代码:
this.EVENT_TYPES
= [“MyEvent1”, “MyEvent2”].concat(
OpenLayers.Control.prototype.EVENT_TYPES );
声明了事件以后,在需要触发事件的时候,控件类只需要调用
triggerEvent
方法即可。
OpenLayers
的事件机制允许事件的触发者在触发事件的时候可以传递一个对象来作为事件相关的信息,事件的监听类会获得这个对象。比如,我们已经有了一个
OpenLayers.Control.MyControl
类的对象
myControl
,现在我们想要触发该对象的
MyEvent1
事件,并在触发事件时,将一个事件准备好的对象
o
传递给事件的接收者。那么,我们的代码一般会是这个样子:
myControl.events.triggerEvent(“MyEvent1”,
o);
那么,监听该事件的类又该如何注册和处理事件呢?
上面提到了,
OpenLayers.Control
类将内部包含的
OpenLayers.Events
对象放置在它的
events
字段上,所以监听事件的类只需调用该字段的
register/on
方法就可以将该事件的处理代码关联到该事件上。
比如,现在我们的另一个对象
myListener
想要监听前文提到的
OpenLayers.Control.MyControl
类的实力
control
的
MyEvent1
和
MyEvent2
,并分别用自身的
myHandler1
和
myHandler2
作为处理响应事件的处理代码。那么,
myListener
需要用如下代码来注册监听这两个事件:
control.event.register(“MyEvent1”,
null, this.myHandler1);
control.event.register(“MyEvent2”,
null, this.myHandler2);
或者用更为简便的
on
方法
control.events.on({
MyEvent1: this.myHandler1,
MyEvent2: this.myHandler2
});
如果想让
myHandler1
或者
myHandler2
处理代码中
this
表示
myListener
。代码则应该改为:
control.event.register(“MyEvent1”,
this, this.myHandler1);
control.event.register(“MyEvent2”,
this, this.myHandler2);
使用
on
方法的代码变为:
control.events.on({
MyEvent1: this.myHandler1,
MyEvent2: this.myHandler2,
scope: this
});
其中,事件处理代码所声明函数的参数所代表的就是触发事件时传入的事件相关信息的对象(上面例子中的
o
)。
3.5.3
殊途同归——两种事件机制的比较
我们可以看到,虽然
OpenLayers
与
Fusion
的事件机制都能很好的解决了
Javascript
没有内置事件机制的问题,但是两种机制的做法却不大相同。
首先,
Fusion
中一个类拥有事件机制是靠继承得来的(需要继承自
Fusion.Lib.EventMgr
类),而
OpenLayers
中一个类拥有事件机制却是靠组合得来的(只需要可以在某个地方初始化一个
OpenLayers.Events
对象)。从这一点说,
OpenLayers
的事件机制更为灵活。
其次,
Fusion
中事件的标识是一个唯一的
ID
(虽然这个
ID
需要一定的代码来维护),而
OpenLayers
的事件标识仅仅是一个字符串。从这一点说,
Fusion
的事件标识更容易维护,在编写程序时更不容易出现注册到错误事件这样的问题。
再者,
Fusion
中监听事件的对象要先解决事件处理函数中的
this
的含义这一问题,然后才会注册该函数到事件,而
OpenLayers
事件处理函数的
this
含义问题在注册事件时是作为一个参数传入的,在代码上更为清楚。
虽然
OpenLayers
的事件机制与
Fusion
的事件机制有些许不同,但是在
Fusion
框架中,您可以使用两种机制中的任何一种来为您的代码添加事件处理能力。一般来说,很多
Widget
的编写者会在与
OpenLayers
控件交互时采用
OpenLayers
的机制,而在其他时候采用
Fusion
的机制。
转载自:https://blog.csdn.net/sasyomaru/article/details/5402052