Underscore: _.debounce()はevent.currentTargetを失います

作成日 2014年10月23日  ·  8コメント  ·  ソース: jashkenas/underscore

_.debounce() addEventListenerを使用すると、 event.currentTargetを取得できません。

これがフィドルです。

最も参考になるコメント

@jridgewell ReactonChangeでこれを回避する方法についてのアイデア。 デバウンスを使用しない場合、onChange関数で適切なイベントにアクセスできますが、 _.debounceを使用すると、適切なeventが失われます-以下を参照してください

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

全てのコメント8件

アンダースコアの範囲外のイベントオブジェクト参照でプロパティが変更された場合。 jQueryのようなlibを使用すると、問題なく参照できる合成イベントオブジェクトを作成するのに役立つ場合があります。

私はあなたがこれを回避するつもりはないと思います。 eventは、DOMを伝播するときに再利用され、リスナーを使用して要素ごとにcurrentTargetが変更されます。 フィドル

2番目のパラメーターを渡すと、これを回避できます。 フィドル

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

はい、これはアンダースコアの範囲外です。 gatorのようなDOMイベントマイクロフレームワークを考えてみましょう

これは、jQueryで動作する例です

currentTarget this取得できます; 私はこの号を開いて、私が見ているものが実際に期待される動作であることを確認しました。

@jridgewell ReactonChangeでこれを回避する方法についてのアイデア。 デバウンスを使用しない場合、onChange関数で適切なイベントにアクセスできますが、 _.debounceを使用すると、適切なeventが失われます-以下を参照してください

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

私の2番目の提案を参照してください。

これは実装の問題です。 イベントを永続化する必要があります。 onChangeはpersistを呼び出し、永続化されたイベントをデバウンスされたハンドラーに渡します。

onChange_persist = (e) =>
{
    e.persist();
    e.onChange_debounced(e);
}
このページは役に立ちましたか?
0 / 5 - 0 評価