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

You may also like...