核心问题
在一个支持 EventDispatcher 的类上发出的事件不会被另一个支持 EventDispatcher 的类拾取。
如何让通信在整个应用程序范围内工作,以便我可以传递消息?
目前它似乎只支持将消息传递给它自己的类。
背景
我正在使用这个样板文件,它给了我三个.js 和 es6:
https://github.com/paulmg/ThreeJS-Webpack-ES6-Boilerplate
我已经手动更新了软件包以使用 three.js r97。
我正在查看 EventDispatcher 类,我认为这是一种在系统中传递消息同时保持解耦的干净方式。例如,我有一些 HTML UI 可以监视一个复选框。
精简到核心示例,我有interaction.js:
import {EventDispatcher} from 'three';
// Manages all input interactions
export default class Interaction {
constructor() {
// Add event dispatcher support
Object.assign( this, EventDispatcher.prototype );
// setup the trigger for the event
let outer = this;
$("#" + Config.uiElements.boxOpenStateId).change(function() {
console.log("event emitting");
outer.dispatchEvent( { type: 'boxOpenStateToggled', message: { isChecked: "example" } } );
console.log("event emitted");
});
// setup a event listener
this.addEventListener( 'boxOpenStateToggled', function ( event ) {
console.log("event caught in Interaction.js", event);
});
}
}
我有 boxmanager.js(精简到核心位):
import {EventDispatcher} from 'three';
export default class BoxManager {
constructor() {
// Add event dispatcher support
Object.assign( this, EventDispatcher.prototype );
}
setupBoxes(manager) {
console.log("adding event listener on BoxManager.js");
this.addEventListener( 'boxOpenStateToggled', function ( event ) {
console.log("event caught by BoxManager.js", event);
} );
}
}
当我在事件侦听器上触发boxOpenStateToggled
事件时不会捕获它。Interaction
BoxManager
我得到一个这样的控制台日志:
adding event listener on BoxManager.js
adding event listener on Interaction.js
(I trigger the event)
event emitting
event caught in Interaction.js {type: "boxOpenStateToggled", message: {…}, target: Interaction}
event emitted
我在这里期待看到“BoxManager 中捕获的事件”——它是系统范围的事件调度程序吗?或者它只能在每个类的基础上在内部调度事件?
展示我的工作
我不确定这是否是我使用它的方式,所以我尝试了:
使用
extends
类上的关键字来提供EventDispatcher
功能,它可以工作,但只能在类中使用。最初使用的
.call
是three.js 早期版本中的版本。
我找不到任何关于使用 EventDispatcher 的真正讨论或示例,也找不到它在库中的使用位置。
我误解了它的目的吗?我用错了吗?