Хорошо, что я сделал некоторый прогресс со времени последнего вопроса пару дней назад, но я все еще совершенно новичок в Javascript и Three.js, и я столкнулся с этой новой проблемой.
Я пытаюсь передать некоторую геометрию three.js, загруженную из OBJ файла, в качестве детали, связанной с настраиваемым событием, так что я могу обработать ее дальше. Имеет смысл сделать это так, как OBJLoader работает асинхронно:
function loadObjAsMesh( obj ) { // Obj Resource URL: Example: 'assets/monster.obj'
var geometry;
var mesh;
loader = new THREE.OBJLoader();
console.log('About to call loader.load');
loader.load(
obj , function ( object ) {
console.log('Starting to run loader.load CALLBACK');
geometry = new THREE.Geometry().fromBufferGeometry( object.children["0"].geometry );
mesh = new THREE.Mesh ( geometry, sceneEntities.materials.bluePhongSolid );
console.log( mesh );
scene.add( mesh );
console.log ( 'About to dispatch the Finished Loading Event' );
dispatchEvent( sceneSyntheticEvents.objectFinishedLoading, {
detail : {
passedMesh : mesh
}
}
);
console.log ( 'Just Dispatched the Finished Loading Event' );
console.log ( sceneSyntheticEvents.objectFinishedLoading );
console.log('Done running loader.load CALLBACK');
} );
console.log('Done calling loader.load');
}
Затем, eventlistener:
function events() {
sceneSyntheticEvents.objectFinishedLoading = new CustomEvent('objectFinishedLoading');
console.log ( 'About to catch the Finshed Loading Event' );
addEventListener('objectFinishedLoading', function (e) { console.log ( e.detail.passedMesh ); }, false);
console.log ( 'Just Caught the Finished Loading Event' );
}
Мероприятие успешно запускается и становится "услышанным" слушателем. Проблема в том, что event.detail имеет значение null. Я пробовал форматировать детали несколькими разными способами - без кубиков, поэтому я уверен, что это не проблема с синтаксисом или соглашениями.
У меня есть лодка инструментов в приложении, как вы можете видеть, и это ясно показывает, что проблема происходит, как только событие срабатывает. Это не значит, что слушатель не получает e.detail. Каким-то образом деталь не включается в событие вообще в тот момент, когда он срабатывает.
Я даже пробовал тестировать целое число несколькими способами, считая, что проблема связана с сеткой. Я попробовал это, например:
dispatchEvent( sceneSyntheticEvents.objectFinishedLoading, {
detail : {
passedMesh : "32"
}
}
а также...
dispatchEvent( sceneSyntheticEvents.objectFinishedLoading, {
detail : "32"
}
Даже при этом консоль сообщает:
CustomEvent {isTrusted: false, detail: null, type: "objectFinishedLoading", target: Window, currentTarget: Window…}
detail: null? "подробно" в кавычках, а не в кавычках, нет разницы.
Я явно нахожусь над этой головой. Есть идеи?
Благодарю.
Метод dispatchEvent принимает один параметр - объект события.
Вам нужно передать объект detail
в конструктор события. В вашем случае вы передаете параметры события в качестве второго аргумента dispatchEvent
который не будет иметь никакого влияния.
addEventListener('my-custom-event', function(e) {
console.log('event handler', e.type);
console.log(e.detail)
}, false);
var event = new CustomEvent('my-custom-event', {
detail: {
key: 'detail-value'
}
})
dispatchEvent(event);
dispatchEvent
принимает только 1 параметр