2013-12-02 1 views
0

У меня есть событие щелчка привязанный к следующей функции Koки:Нокаут связывают DoubleClick и SingleClick, игнорировать Singleclick если двойной щелчок

self.select = function (entity, event) { 
     var ctrlPressed = false; 
     if (event.ctrlKey) { ctrlPressed = true; } 
     if (!ctrlPressed) { 
      manager.deselectAll(); 
      this.selected(true); 
     } else { 
      this.selected() ? this.selected(false) : this.selected(true); 
     } 
    } 

Он привязывается, как так:

data-bind="click: select, event: { dblclick: function(){alert('test');}}" 

Это в настоящее время работает за исключением что он дважды «дважды выбирает», когда вы дважды щелкаете, чего я не хочу. Я пробовал следовать за the advice in this SO question, но когда я создаю функцию singleClick(), я получаю сообщение об ошибке «ctrlKey не является функцией неопределенного». Таким образом, это событие не проходит должным образом. Более того, функция doubleClick() в другом ответе там вообще не работает. Он дает ошибку в части «handler.call», говоря, что обработчик не определен.

Итак, как я могу успешно вызвать функцию выбора ko на singleClick, но не на двойном щелчке?

ответ

1

Я не думаю, что это действительно проблема с нокаутом. У вас есть, по крайней мере, эти два варианта: 1. Внедрение некоторой пользовательской логики, которая предотвращает обработку, если один клик уже начал обрабатывать 2. Предотвратите функцию двойного щелчка в целом. JQuery имеет этот удобный обработчик:

$(selector).on("dblclick", function(e){ 
    e.preventDefault(); //cancel system double-click event 
}); 
+0

Это не работает. –

0

Так что я технически получил его на работу. Вот моя новая функция Singleclick

ko.bindingHandlers.singleClick = { 
    init: function (element, valueAccessor, c, viewModel) { 
     var handler = valueAccessor(), 
      delay = 400, 
      clickTimeout = false; 

     $(element).click(function (event) { 
      if (clickTimeout !== false) { 
       clearTimeout(clickTimeout); 
       clickTimeout = false; 
      } else { 
       clickTimeout = setTimeout(function() { 
        clickTimeout = false; 
        handler(viewModel, event); 
       }, delay); 
      } 
     }); 
    } 
}; 

Это проходит ViewModel и событие для обработчика, так что я все еще могу изменить наблюдаемые и захватить ctrlKey нажимается.

Связывание:

data-bind="singleClick: select, event: { dblclick: function(){alert('test');}}" 

Проблема заключается в том, что теперь, очевидно, одного нажатия элемент имеет задержку в то время как он ждет, чтобы увидеть, если это двойной щелчок. Я считаю, что это неотъемлемая и неразрешимая проблема, поэтому, если это технически отвечает на мой вопрос, я рассмотрю совершенно другой маршрут (т. Е. Вообще не будет двойного щелчка на моем интерфейсе)