2

ボタンが押されたときのデフォルトの動作を変更したい - ボタンがダブルクリックされないようにする必要があります。

1 つのオプションは、ボタンがバインドされている関数をアンダースコアから _.once() または _.throttle() にラップすることですが、これをスタックの上位で処理した方がよいでしょう。

だから私はこの質問を見つけました:バインディングハンドラーと答えで参照されているフィドルをオーバーライドするノックアウトjs ( http://jsfiddle.net/rniemeyer/PksAn/)そしてそれで何かをしようとしました。以下は、フィドルの元のコードです。

(function(){
var originalInit = ko.bindingHandlers.click.init,
    originalUpdate = ko.bindingHandlers.click.update;

ko.bindingHandlers.click = {
    init: function(element, valueAccessor, allBindingsAccessor, viewModel) {
        var wrappedValueAccessor = function() {
            return function(data, event) {
                ko.bindingHandlers.click.preOnClick.call(viewModel, data, event);
                valueAccessor().call(viewModel, data, event);
                ko.bindingHandlers.click.postOnClick.call(viewModel, data, event);
            };
        };

        originalInit(element, wrappedValueAccessor, allBindingsAccessor, viewModel);
    },
    update: originalUpdate,
    preOnClick: function(data, event) {
    },
    postOnClick: function(data, event) {
    }
};
})();

私は _.throttle() でラップされたValueAccessorをラップしようとしましたが、ネストされた関数もラップしようとしましたが、valueAccessor() が毎回新しい関数を返していることがわかり、これが私がラップするはずのものだと思います.

そのコードは次のとおりです: (knockout-2.2.1.debug.js の 2043 行目から)

function makeValueAccessor(bindingKey) {
    return function () { return parsedBindings[bindingKey] }
}

つまり、間違っていると思われるノックアウトの内部に入る必要があります。

だから私の質問は、私はここで正しい考えに進んでいるのか、それともアプローチが完全に間違っているのかということです. これを行うより良い方法はありますか?

4

1 に答える 1

3

返されたハンドラー関数のdebounceバージョンを作成して保存し、そのデバウンスされたバージョンを関数から返すことができます。valueAccessorwrappedValueAccessor

init: function(element, valueAccessor, allBindingsAccessor, viewModel) {
    var debouncedAccessor = _.debounce(valueAccessor(), 800, true)
    var wrappedValueAccessor = function() {
        return debouncedAccessor;
    };        
    originalInit(element, wrappedValueAccessor, allBindingsAccessor, viewModel);
},

JSFiddleのデモ。

于 2013-09-30T11:28:17.590 に答える