使用knockout.js防止双击按钮

Mik*_*ynn 16 javascript knockout.js

什么是禁用按钮的最佳方法,因此knockout.js不会发生双击.我有一些用户快速点击导致多个ajax请求.我认为knockout.js可以通过多种方式处理这个问题,并希望看到其中的一些替代品.

Tra*_*s J 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>
Run Code Online (Sandbox Code Playgroud)

通过将嵌套函数内的逻辑更改为

if( this.numberOfClicks() > 1 ){
 //TODO: Handle multiple clicks or simply return false
 // and perhaps implement a timeout which clears the lockout
}
Run Code Online (Sandbox Code Playgroud)


Pat*_*k M 12

我遇到了类似的问题,表单向导通过Ajax按钮点击提交数据.我们为每个步骤选择性地显示4个按钮.我们创建了一个boolean observable ButtonLock,如果它是真的,则从提交函数返回.然后我们还将disable每个按钮数据绑定到ButtonLockobservable

视图模型:

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);
    }
Run Code Online (Sandbox Code Playgroud)

按钮:

<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);
        }"/>
Run Code Online (Sandbox Code Playgroud)

如果你只需要防止多次点击,我更喜欢布尔值.但是,如果您需要该功能,计数器方法可让您检测双击并单独处理它们.

  • 我更喜欢这个答案.它为用户提供了一些关于正在发生的事情与计数方法的视觉指示.用户可以反复点击按钮,没有指示正在发生的事情,因此他们可能会认为某些事情已经破裂. (4认同)

Leo*_*chi 6

如果有人还在寻找一种方法来做到这一点.我发现你可以使用布尔值.

self.disableSubmitButton= ko.observable(false);
  self.SubmitPayment = function () {
        self.disableSubmitButton(true);
       //your other actions here
        }
Run Code Online (Sandbox Code Playgroud)

然后在你看来

data-bind="click:SubmitPayment, disable:disableSubmitButton"
Run Code Online (Sandbox Code Playgroud)