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

Ну, я добился некоторого прогресса с момента последнего вопроса пару дней назад, но я все еще новичок в 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');
}

Тогда вот список событий:

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…}

деталь: ноль? "подробно" в кавычках, а не в кавычках, без различий.

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

Благодарю.

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);

Другие вопросы по тегам