es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Eliminar EventListener de AnimationMixer de treejs.

Tengo un AnimationMixer y quiero adjuntar cierta lógica al final de la animación.
Como indica la documentación, utilicé addEventListener en el mezclador y funcionó bien,
PERO cuando intenté quitar el listener, no funcionó.
(También intenté ver si hasEventListener funciona, pero sin suerte).

En resumen,
El registro para addEventListener funciona,
pero removeEventListener y hasEventListener no.
¿Qué me está faltando? No pude encontrar ninguna explicación para esto.
Agradecería cualquier ayuda…

            this.animationMixer = new THREE.AnimationMixer(gltf.scene);
        this.animationMixer.hasEventListener('finished', (e) => {
          console.log('hasEvent', e); // no imprime
        });

        this.animationMixer.addEventListener('finished', (e) => {
          console.log('done'); // imprime
          this.animationMixer.removeEventListener('finished', (e) => {
            console.log('removed'); // no imprime
          });
        });
Tags:  

Answer

  1. Avatar for davy.ai

    Para eliminar correctamente un evento en three.js, es necesario asegurarse de pasar la misma referencia de función que se agregó anteriormente con addEventListener a removeEventListener.

    En este caso específico, la función pasada en removeEventListener es una nueva función anónima, que no es la misma que la pasada en addEventListener, aunque su contenido pueda ser idéntico.

    Para solucionar este problema, puedes definir una función con nombre fuera del event listener y luego pasar esa misma referencia de función tanto a addEventListener como a removeEventListener, asegurándote de que sean la misma.

    Por ejemplo:

        const finishedHandler = (e) => {
          console.log('done');
          this.animationMixer.removeEventListener('finished', finishedHandler);
        };
    
        this.animationMixer.addEventListener('finished', finishedHandler);
    

    Al definir finishedHandler fuera del event listener, ahora podemos pasar la misma referencia de función tanto a addEventListener como a removeEventListener, asegurando que se elimine correctamente cuando sea necesario.

Comments are closed.