启用单击绑定的条件

时间:2013-06-26 13:41:00

标签: knockout.js

有没有办法为点击绑定指定启用条件?例如,如果我有以下内容:

<div data-bind="click: toggleDialog">Click Me</div>

如果发生指定的情况,我希望能够禁用点击,这样可以产生以下效果:

<div data-bind="click: toggleDialog, enableClick: myName() === 'John'">Click Me</div>

我想也许自定义绑定可能会起作用,但不太确定如何去做。

4 个答案:

答案 0 :(得分:11)

你可以使用我为锚点做的这种方法

http://jsfiddle.net/xCfQC/11/

(function() {
    //First make KO able to disable clicks on Anchors
    var orgClickInit = ko.bindingHandlers.click.init;
    ko.bindingHandlers.click.init = function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
      if(element.tagName === "DIV" && allBindingsAccessor().enable != null) {
          var disabled = ko.computed({
              read: function() {
                  return ko.utils.unwrapObservable(allBindingsAccessor().enable) === false;                                     
              }, 
              disposeWhenNodeIsRemoved: element
          });
          ko.applyBindingsToNode(element, { css: { disabled: disabled}  });
          var handler = valueAccessor(); 
          valueAccessor = function() {
              return function() {
                  if(ko.utils.unwrapObservable(allBindingsAccessor().enable)) { 
                      handler.apply(this, arguments);   
                  }
              }
          };         
      } 
      orgClickInit.apply(this, arguments);
    };
})();

更多细节: https://github.com/AndersMalmgren/Knockout.BindingConventions/wiki/Button-convention

答案 1 :(得分:3)

它实际上比任何这些选项都简单得多。你不能使绑定条件,但你可以使什么函数被触发条件。只需在绑定中使用条件:

<div data-bind="click: myName() === 'John' ? toggleDialog : function(){ /* Nothing Happens */}">Click Me</div>

这将触发toggleDialog()或无效的匿名function(){}

您甚至可以堆叠绑定属性以禁用按钮本身:

<div data-bind="
    disabled: myName() !== 'John',
    click: myName() === 'John' ? toggleDialog : function(){ /* Nothing Happens */}
">Click Me</div>

或者有另一个函数响应未满足条件而运行:

<div data-bind="
    disabled: myName() !== 'John',
    click: myName() === 'John' ? toggleDialog : tellUserTheyAreWrong
">Click Me</div>

希望这有帮助

答案 2 :(得分:0)

我最近这样做并将条件检查放入click函数本身,因此除非满足条件,否则它不会执行任何操作。然后我还使用一个计算函数来为元素提供css类,并根据元素是否对点击做出反应来更改光标:

在我的视图模型中:

iconStyle = ko.computed(function () {
    var cssClass = 'DefaultClass';
     if (/*condition to check if click is valid*/) {
        cssClass = cssClass + ' Off';
     }

    return cssClass;
})

然后像这样绑定:

<div class="stepIcon" data-bind="click: clickFunction, css: iconStyle"></div>

答案 3 :(得分:0)

凯尔,在阅读你对nemsev的评论后,我相信你想要禁用你的按钮,而不是你的对话功能。

绑定......

<button data-bind="click: doAlert, enable: allowAlert">Open Dialog</button>
<div data-bind="click: doAlert">Click me for another call to trigger the dialog</div>
<button data-bind="click: toggleAllowAlert, text: allowButtonText"></button>

代码......

var viewModel = function(){
    var self = this;
    self.allowAlert = ko.observable(true);
    self.allowButtonText = ko.computed(function(){
        if(self.allowAlert()){ 
            return 'Turn off button'; 
        } else { 
            return 'Turn on button'; 
        }
    });
    self.toggleAllowAlert = function(){
        self.allowAlert(!self.allowAlert());
    };
    self.doAlert = function(){
        alert('The dialog has opened');
    };
}

ko.applyBindings(new viewModel());

http://jsfiddle.net/DQg5P/1/