在做前端项目的过程中经常会遇到这种问题,即执行完某个动作之后调用另外模块的某个功能。而如果需要执行的功能在该模块中不对外调用,这样就会有比较曲折的方法去调用。今天翻看以前的项目代码,发现有一种比较快捷的实现方法,即在前端设置"侦听者"模式。
方法的实现思路很简单。
首先,需要一个全局数组或者hash来存储所有的注册事件,同时在工程中设置全局都可调用的函数,subscribe,这个函数的主要功能是实现事件的注册,id和dataType应唯一,caller是回调函数。代码片段如下。
function <span style="font-family: Arial, Helvetica, sans-serif;">subscribe</span>(id, dataType, caller)
{
var obj = new Object();
obj.id = id;
obj.dataType = dataType;
obj.caller = caller;
this.data.list.push(obj);
};
其次,一个对应的消息发送函数也是必须的,这个函数主要的功能为消息的发送,即通知侦听者,“我已经准备好了,你可以调用相应的回调了”。代码片段如下。
function publish(dataType, opts)
{
var items = getsFromArrayO(this.data.list, {dataType: dataType});//从已经注册的数组中找到相应的事件
for(var i in items)
{
var caller = items[i].caller;
if(typeof caller == "function")
caller(opts);
else if(caller)
caller.call(opts);
}
};
经过以上两步,就可以实现前端的消息侦听发送了。
使用的方法是首先在有需要调用的地方使用subscribe注册一个事件,然后在执行完某个动作后需要调用别的方法的时候使用publish函数发送相应的消息,侦听者会自动从已经注册的方法找到对应的回调来执行。这种方法使用起来非常方便。