行を上下矢印で選択できるテーブルがあり、行が選択されるとこれがオフになり、ajax経由でレコードが取得されます。keydownイベントリスナーからデバウンス関数を抽出する
ユーザーがスパム送信するajaxリクエストを停止するには、私がディレクティブから呼び出しているデバウンス機能があります。これはkeydownイベントによってトリガーされます。これはすべて機能しますが、必要な方法ではありません。私は、デバウンス関数が呼び出される前にpreventDefaultを呼び出すようにします。したがって、ユーザーは遅れなく行を上下に移動でき、遅れてもAJAXはまだ起動します。
私はこれを可能にするために私のコードを抽出する必要があると思うが、いくつかのことを試みた後、私はそれを働かせることはできない。ディレクティブでは
:これはオリジナルバージョンであるコントローラで
$('table').keydown(scope.debounce(function (e) {
if(e.keyCode == 38) { // Up arrow
// Do Ajax stuff
e.preventDefault();
e.stopPropagation();
}
if(e.keyCode == 40) { // Down arrow
// Do Ajax stuff
e.preventDefault();
e.stopPropagation();
}
}, 250));
:
$scope.debounce = function (fn, delay) {
var timer = null;
return function() {
var context = this, args = arguments;
clearTimeout(timer);
timer = setTimeout(function() {
fn.apply(context, args);
}, delay);
};
};
私はKeyDownイベントで呼び出される関数を抽出しようとしたが、今それだけで遅延を無視しています。それを働かせる方法の周りに私の頭を得ることができません。コントローラで
:毎回のKeyDownイベントが押されているようですが、someFunction
が呼ばれたように見え
$('table').keydown(someFunction);
function someFunction(e) {
e.preventDefault();
e.stopPropagation();
var blahblah = scope.debounce(function (e) {
if(e.keyCode == 38) { // Up arrow
// Do Ajax stuff
}
if(e.keyCode == 40) { // Down arrow
// Do Ajax stuff
}
}, 250);
blahblah();
}
を使用すると、var timer = setTimeout(function(){ fn.apply(context、args); }、delay)を使用できます。 }; –
あなたは何を意味するのか完全に理解していませんが、あなたが言うようにコードを置き換えても機能しません。 – spengos