2011-03-06 111 views
0

我正在写一个小模块,它有几个不同的方面,都基于Ajax调用。我想允许主要的ajax函数,即beforeSend,成功,完成等(我使用jQuery)是可定制的。Javascript - 传递和查找回调函数

这样做的最好方法是什么?

我目前在模块中有一个选项对象,可以通过传递给init函数的选项对象进行扩展。在这里,我传递嵌套ojects一个“回调”对象为每个不同类型的动作......

 var insertCallbacks = { 

     before : function() { 

     }, 
     success : function() { 

     }, 
     error : function() { 

     }, 
     complete : function() { 

     } 
    }; 

    var updateCallbacks = { 
     before : function() { 

     }, 
     success : function() { 

     }, 
     error : function() { 

     }, 
     complete : function() { 

     } 
    }; 

    var callbacks = { 
     insert : addCallbacks, 
     update : removeCallbacks  
    }; 

    MY_MODULE.init({callbacks : callbacks}); 

问题是这样的,然后变得有点凌乱,测试每一种的存在有关ajax回调的方法。

任何人都可以提供任何建议在这个好/更好的模式。

回答

3

我会去自定义事件,而不是回调。所以,你的模块中,你将有类似的代码:

MY_MODULE.trigger('updateComplete'); 

,并在模块之外的所有部件(以及里面如果需要的话),你绑定处理程序(现在又回调):

MY_MODULE.bind('updateComplete', function() { 
    alert('update completed'); 
}); 

Custom events in jQuery open doors to complex behaviors,或谷歌任何其他文章。自定义事件会帮助你保持代码的结构,并且更易于测试

加上:你需要经常检查是否有任何的回调,所以你的代码变得

if (callbacks && callbacks.insert) { 
    callbacks.insert(); 
} 

提高你的模块功能并加强它,有一天你会遇到一种情况,即在相同的情况下应该传递很少的回调(例如,两个实体或UI组件对模块“更新”感兴趣)......这会让你的工作太困难。随着活动,你总是有一个不带条件之一的代码行

MY_MODULE.trigger('updateComplete'); 

,以检查是否有附加任何处理(感兴趣的事件),你可以有多达同一事件需要处理。

+0

+1打我到21秒:D – Tomalak 2011-03-06 22:37:56

+0

@Tomalak:Danke und Entschuldigung;) – Maxym 2011-03-06 22:40:16

+0

Kein问题。 :-)无论如何,你的是更好的答案。 – Tomalak 2011-03-06 22:44:03

1

只是做jQuery同样的事情。让您的模块触发事件(通过trigger())并在必要时将处理程序附加到这些事件(通过bind())。这样你就不必在你的模块里面检查什么函数正在监听(或者如果有的话)。

由于你的代码不包含任何东西我可以使用样本,这是很难添加代码到这个答案。

+0

+1你也值得拥有它;) – Maxym 2011-03-06 22:41:53