我正在编写一个小模块,它有几个不同的方面,都基于ajax调用。我想允许主要的ajax函数,即beforeSend,success,complete等(我使用的是jQuery)可以自定义。
这样做的最佳方式是什么?
我目前在模块中有一个选项对象,可以使用传递给init函数的选项对象进行扩展。在这里,我传递一个带有嵌套对象的'回调'对象,用于每个不同类型的操作,如...
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回调上测试每种方法的存在。
任何人都可以为此提供关于良好/更好模式的任何建议。
答案 0 :(得分:3)
我会使用自定义事件而不是回调。因此,在您的模块中,您将拥有如下代码:
MY_MODULE.trigger('updateComplete');
并且在模块之外的所有部分(以及内部,如果需要),绑定处理程序(现在它们是回调):
MY_MODULE.bind('updateComplete', function() {
alert('update completed');
} );
Custom events in jQuery open doors to complex behaviors,或谷歌任何其他文章。自定义事件将帮助您保持代码结构化,并且更容易测试
添加ON:使用回调,您需要始终检查是否有,所以您的代码变为
if ( callbacks && callbacks.insert ) {
callbacks.insert();
}
改进模块功能并增强它,有一天你会遇到一种情况,即在相同的情况下应该传递很少的回调(例如,两个实体或UI组件对模块'更新'感兴趣)...它会使你的工作太难了。对于事件,您总是有一个代码行
MY_MODULE.trigger('updateComplete');
没有条件来检查是否附加了任何处理程序(对事件感兴趣),并且您可以为同一事件提供所需数量的处理程序。
答案 1 :(得分:1)
就像jQuery那样做。让您的模块触发事件(通过trigger()
)并在必要时(通过bind()
)将处理程序附加到这些事件。这样,您无需在模块内部检查正在侦听的功能(或者根本不是)。
由于您的代码不包含任何我可以用于示例,因此很难在此答案中添加代码。