Underscore: _.debounce() perd event.currentTarget

Créé le 23 oct. 2014  ·  8Commentaires  ·  Source: jashkenas/underscore

Je ne parviens pas à obtenir le event.currentTarget lorsque j'utilise addEventListener avec _.debounce() .

Voici un violon .

Commentaire le plus utile

@jridgewell toute idée de comment contourner cela dans un React onChange. quand je n'utilise pas debounce, je peux accéder à l'événement approprié dans ma fonction onChange mais quand j'utilise _.debounce je perds le bon event - voir ci-dessous

// in my render
<input onChange={ _.debounce(this.updateNote.bind(this), 500) } />
// my change handler
updateNote(event) {
    // undefined on event.target, get lodash event not <input/> event target
    const note = event.target.value
    this.sendNote({ note })
 }

Tous les 8 commentaires

Si la propriété est modifiée sur la référence d'objet d'événement qui est en dehors de la portée de Underscore. Si vous utilisez une bibliothèque comme jQuery, cela peut vous aider car ils créent un objet d'événement synthétique que vous devriez pouvoir référencer sans problème.

Je ne pense pas que vous allez contourner cela. event est réutilisé car il se propage dans le DOM, avec currentTarget changeant pour chaque élément avec un écouteur. violon

Passer un deuxième paramètre peut contourner ce problème. violon

var debounced = _.debounce(fn, 50);
document.querySelector('.debounced-input').addEventListener('keyup', function(event) {
    debounced(event, event.currentTarget);
});

Oui, cela sort du cadre du trait de soulignement. Considérez un micro framework d'événement DOM comme gator

En voici un exemple fonctionnant avec jQuery.

Je peux toujours obtenir l'élément que currentTarget a habituellement avec this ; Je viens d'ouvrir ce problème pour m'assurer que ce que je vois est bien le comportement attendu.

@jridgewell toute idée de comment contourner cela dans un React onChange. quand je n'utilise pas debounce, je peux accéder à l'événement approprié dans ma fonction onChange mais quand j'utilise _.debounce je perds le bon event - voir ci-dessous

// in my render
<input onChange={ _.debounce(this.updateNote.bind(this), 500) } />
// my change handler
updateNote(event) {
    // undefined on event.target, get lodash event not <input/> event target
    const note = event.target.value
    this.sendNote({ note })
 }

C'est une question de mise en œuvre. Vous devez conserver l'événement. onChange doit appeler un persist et ALORS transmettre l'événement persistant au gestionnaire anti-rebond :

onChange_persist = (e) =>
{
    e.persist();
    e.onChange_debounced(e);
}
Cette page vous a été utile?
0 / 5 - 0 notes