禁用按钮的最佳方法是什么,以便在 knockout.js 中不会发生双击。我有一些用户快速点击导致多个 ajax 请求。我认为 knockout.js 可以通过多种方式处理这个问题,并且希望看到一些替代方案。
问问题
9674 次
4 回答
14
使用信号量(自旋锁)。基本上,您计算一个元素已注册的点击次数,如果它超过 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
}
于 2012-04-24T22:29:59.337 回答
12
我在单击按钮时通过 Ajax 提交数据的表单向导遇到了类似的问题。对于每个步骤,我们有 4 个选择性可见的按钮。我们创建了一个 boolean observable ButtonLock
,如果它为真,则从提交函数返回。然后我们还将disable
每个按钮的数据绑定到ButtonLock
observable
视图模型:
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);
}"/>
如果您只需要防止多次点击,我更喜欢布尔值。但是,如果您需要该功能,计数器方法可以让您检测双击并单独处理它们。
于 2012-08-07T18:40:30.477 回答
7
以防有人仍在寻找一种方法来做到这一点。我发现你可以使用布尔值。
self.disableSubmitButton= ko.observable(false);
self.SubmitPayment = function () {
self.disableSubmitButton(true);
//your other actions here
}
那么在你看来
data-bind="click:SubmitPayment, disable:disableSubmitButton"
于 2016-02-18T14:07:38.640 回答
1
我使用自定义绑定做到了这一点:
<button data-bind="throttleClick: function() { console.log(new Date()); }>
I wont double click quicker than 800ms
</button>
ko.bindingHandlers.throttleClick = {
init: function(element, valueAccessor) {
var preventClick = false;
var handler = ko.unwrap(valueAccessor());
$(element).click(function() {
if(preventClick)
return;
preventClick = true;
handler.call();
setTimeout(function() { preventClick = false; }, 800);
})
}
}
于 2018-02-05T10:38:42.603 回答