d3.js的事件派遣困惑

时间:2015-04-19 00:30:57

标签: events d3.js

来自docs d3.js事件的AFAICT,生成消耗此类事件的代码的所有部分必须能够访问{ {1}}该事件被“声明”的对象(缺少更好的词)。

这意味着此d3.dispatch()对象必须是全局可见的,即它必须保存在全局变量中。实际上,如果这个变量的范围更窄,那么这个事件的生成器消费者都必须生活在同一范围内,这显然违背了事件驱动编程的目的,即完全解耦代码的各个部分(即范围),其中事件是从消耗这些事件的那些事件生成的。

该方案对共享d3.dispatch对象的依赖对我没有意义。如果dispatch返回的值始终是同一个对象,那会好一点(虽然,IMO,不理想)。 AFAICT,以下测试表明情况并非如此(前导d3.dispatch()>字符分别表示输入和输出):

<

我误解了什么吗?

1 个答案:

答案 0 :(得分:2)

如果您阅读代码,您可以看到d3.dispatch是一个工厂函数,它返回一个新的d3_dispatch对象,该对象是一个添加了新d3_dispatch_event个对象的函数,对应于传递给dispatch工厂的参数。 d3_dispatch_event工厂返回一个对象,其中包含添加和服务以及公开侦听器及其回调的方法。它还在关联的侦听器数组上形成闭包,这对每个事件都是唯一的。

因此,基本上,每个dispatch都是一个新对象,其行为继承自d3_dispatch.prototyped3_dispatch_event.prototype,状态在d3_dispatch_event工厂中关闭。