Javascript CustomEvent подробно обнуляется при увольнении?

1

Хорошо, что я сделал некоторый прогресс со времени последнего вопроса пару дней назад, но я все еще совершенно новичок в 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? "подробно" в кавычках, а не в кавычках, нет разницы.

Я явно нахожусь над этой головой. Есть идеи?

Благодарю.

Теги:
javascript-events
event-handling
custom-events

1 ответ

1
Лучший ответ

Метод 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);
  • 0
    Спасибо! Работал как шарм! Теперь мне интересно, было ли это очевидно во всей документации, которую я проверял все это время? Спасибо Arun P Johny за спасение от головной боли.
  • 0
    @MarkScottLavin, если вы посмотрите на документ, который я упоминал выше, то ясно, что dispatchEvent принимает только 1 параметр

Ещё вопросы

Сообщество Overcoder
Наверх
Меню