我正在尝试找到一种很好的方法来获得视图和控制器,并最大限度地减少它们之间的联系。
除了一个事件的多个订阅者之外,这样的js代码之间是否存在任何重大差异:
var customers = {
get: function(callback) {
$.get('/customers', {}, function(data) {
callback.call(this, data);
});
}
};
这样的事件驱动方法(事件对象只是伪代码):
var customers = {
get: function() {
$j.get('/customers', {}, function(data) {
event.publish('customers.loaded', data);
});
}
};
在这两种情况下,客户对象的消费者都不了解其内部运作。一种方式比另一种方式有优势吗?
答案 0 :(得分:9)
事件的是回调,但区别在于它们被绑定的时间和地点。在第一种情况下,您需要在调用get
时引用回调,此外它仅限于单个回调。
在第二种情况下,(假设您正在触发具有该伪代码的事件),您可以在调用get
的范围之外绑定一个回调,从而允许更强大的数据封装。此外,事件支持触发多个回调,因此可以执行不同的功能,具体取决于对customers
对象的访问权限。
我建议使用面向事件的解决方案,因为JavaScript是一种面向事件的语言。
答案 1 :(得分:5)
答案很简单:因为一个事件可能有无限事件处理程序(这些只是回调)......并且回调只是一个回调,我建议您使用事件驱动编程方法。
答案 2 :(得分:4)
我会在制作模块时使用回调解决方案。这有一个较少的依赖:对事件对象的依赖。
如果我下载第三方插件,让我们说你现在正在处理的那个插件,我希望控制在执行该功能时调用的内容并使用我自己选择的事件来提升我自己的事件总线。
如果不制作模块,我认为这两种解决方案都有其魅力。 :)