Предотвратите двойной щелчок на кнопке с knockout.js
Каков наилучший способ отключить кнопку, так что двойной клик не возникает с knockout.js. У некоторых пользователей есть быстрый клик, вызывающий несколько запросов ajax. Я предполагаю, что knockout.js может справиться с этим несколькими способами и хочет увидеть некоторые альтернативы там.
Ответы
Ответ 1
Используйте семафор (прямая блокировка). В основном вы считаете, сколько кликов зарегистрировал элемент, и если оно больше 1, вы возвращаете false и не разрешаете следующие клики. Функция тайм-аута может использоваться для очистки блокировки, чтобы они могли щелкнуть снова, скажем, 5 секунд. Вы можете изменить пример из http://knockoutjs.com/documentation/click-binding.html
Как показано здесь:
<div>
You've clicked <span data-bind="text: numberOfClicks"></span> times
<button data-bind="click: incrementClickCounter">Click me</button>
</div>
<script type="text/javascript">
var viewModel = {
numberOfClicks : ko.observable(0),
incrementClickCounter : function() {
var previousCount = this.numberOfClicks();
this.numberOfClicks(previousCount + 1);
}
};
</script>
Изменив логику внутри вложенной функции на
if( this.numberOfClicks() > 1 ){
//TODO: Handle multiple clicks or simply return false
// and perhaps implement a timeout which clears the lockout
}
Ответ 2
У меня возникла аналогичная проблема с тем, что мастер формы отправил данные через Ajax при нажатии кнопки. У нас есть 4 кнопки, избирательно видимые для каждого шага. Мы создали булевое наблюдаемое ButtonLock
и вернулись из функции отправки, если оно было истинным. Затем мы также привязываем данные disable
каждой кнопки к наблюдаемому ButtonLock
ViewModel:
var viewModel = function(...) {
self.ButtonLock = ko.observable(false);
self.AdvanceStep = function (action) {
self.ButtonLock(true);
// Do stuff
// Ajax call
}
self.AjaxCallback = function(data) {
// Handle response, update UI
self.ButtonLock(false);
}
Кнопка
<input type="button" id="FormContinue" name="FormContinue" class="ActionButton ContinueButton"
data-bind="
if: CurrentStep().actions.continueAction,
disable: ButtonLock,
value: CurrentStep().actions.continueAction.buttonText,
click: function() {
AdvanceStep(CurrentStep().actions.continueAction);
}"/>
Если вам просто нужно предотвратить несколько кликов, я предпочитаю логическое значение. Но метод счетчика позволяет обнаруживать двойные щелчки и обрабатывать их отдельно, если вы хотите эту функцию.
Ответ 3
Если кто-то все еще ищет способ сделать это. Я обнаружил, что вы можете использовать логическое значение.
self.disableSubmitButton= ko.observable(false);
self.SubmitPayment = function () {
self.disableSubmitButton(true);
//your other actions here
}
Затем на ваш взгляд
data-bind="click:SubmitPayment, disable:disableSubmitButton"