来自docs d3.js事件的AFAICT,生成或消耗此类事件的代码的所有部分必须能够访问{ {1}}该事件被“声明”的对象(缺少更好的词)。
这意味着此d3.dispatch()
对象必须是全局可见的,即它必须保存在全局变量中。实际上,如果这个变量的范围更窄,那么这个事件的生成器和消费者都必须生活在同一范围内,这显然违背了事件驱动编程的目的,即完全解耦代码的各个部分(即范围),其中事件是从消耗这些事件的那些事件生成的。
该方案对共享d3.dispatch
对象的依赖对我没有意义。如果dispatch
返回的值始终是同一个对象,那会好一点(虽然,IMO,不理想)。 AFAICT,以下测试表明情况并非如此(前导d3.dispatch()
和>
字符分别表示输入和输出):
<
我误解了什么吗?
答案 0 :(得分:2)
如果您阅读代码,您可以看到d3.dispatch
是一个工厂函数,它返回一个新的d3_dispatch
对象,该对象是一个添加了新d3_dispatch_event
个对象的函数,对应于传递给dispatch
工厂的参数。 d3_dispatch_event
工厂返回一个对象,其中包含添加和服务以及公开侦听器及其回调的方法。它还在关联的侦听器数组上形成闭包,这对每个事件都是唯一的。
因此,基本上,每个dispatch
都是一个新对象,其行为继承自d3_dispatch.prototype
和d3_dispatch_event.prototype
,状态在d3_dispatch_event
工厂中关闭。