Underscore: _.debounce() verliert event.currentTarget

Erstellt am 23. Okt. 2014  ·  8Kommentare  ·  Quelle: jashkenas/underscore

Ich kann event.currentTarget nicht abrufen, wenn ich addEventListener mit _.debounce() verwende.

Hier ist eine Geige .

Hilfreichster Kommentar

@jridgewell eine Idee, wie man dies in einem React onChange umgehen kann. Wenn ich Debounce nicht verwende, kann ich auf das richtige Ereignis in meiner onChange-Funktion zugreifen, aber wenn ich _.debounce verwende, verliere ich das richtige event – siehe unten

// 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 })
 }

Alle 8 Kommentare

Wenn die Eigenschaft in der Ereignisobjektreferenz geändert wird, die außerhalb des Bereichs von Underscore liegt. Wenn Sie eine Bibliothek wie jQuery verwenden, kann dies hilfreich sein, da sie ein synthetisches Ereignisobjekt erstellen, auf das Sie problemlos verweisen können sollten.

Ich glaube nicht, dass du das umgehen wirst. event wird wiederverwendet, während es das DOM nach oben verbreitet, wobei sich currentTarget für jedes Element mit einem Listener ändert. Geige

Das Übergeben eines zweiten Parameters kann dies umgehen. Geige

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

Ja, das liegt außerhalb des Bereichs des Unterstrichs. Betrachten Sie ein Mikro-Framework für DOM-Ereignisse wie gator

Ich kann immer noch das Element bekommen, das currentTarget normalerweise mit this hat; Ich habe dieses Problem nur geöffnet, um sicherzustellen, dass das, was ich sehe, tatsächlich das erwartete Verhalten ist.

@jridgewell eine Idee, wie man dies in einem React onChange umgehen kann. Wenn ich Debounce nicht verwende, kann ich auf das richtige Ereignis in meiner onChange-Funktion zugreifen, aber wenn ich _.debounce verwende, verliere ich das richtige event – siehe unten

// 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 })
 }

Siehe meinen zweiten Vorschlag .

Dies ist eine Frage der Umsetzung. Sie müssen das Ereignis beibehalten. onChange sollte ein persist aufrufen und DANN das persistente Ereignis an den entprellten Handler übergeben:

onChange_persist = (e) =>
{
    e.persist();
    e.onChange_debounced(e);
}
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

xiaoliwang picture xiaoliwang  ·  3Kommentare

jdalton picture jdalton  ·  4Kommentare

dmaicher picture dmaicher  ·  9Kommentare

Francefire picture Francefire  ·  5Kommentare

acl0056 picture acl0056  ·  5Kommentare