带有条件的淘汰赛事件绑定

Posted

技术标签:

【中文标题】带有条件的淘汰赛事件绑定【英文标题】:Knockout event binding with condition 【发布时间】:2018-08-04 21:36:03 【问题描述】:

我想将一些事件绑定到一个元素,使用淘汰赛“事件”绑定 但我希望所有列出的事件仅与特定案例绑定。

视图模型:

function vm()
var self = this;
self.isEditMode = ko.observable(false);//can be changed to true
self.events = ko.observable(
    down: function () 
        console.log("down")
    ,
    up: function () 
        console.log("up")
    ,
    hover: function () 
        console.log("hover")
    
);

html:

    <div style="border:1px solid red;width:50px;height:50px"
         data-bind="event:mousedown:events().down,mouseup:events().up,mouseover:events().hover:null"></div>
    <button data-bind="click:function()isEditMode(!isEditMode())">change </button>

我试过了:

 <div data-bind="event:isEditMode()?mousedown:events().down,mouseup:events().up,mouseover:events().hover:null"></div>

但它对我不起作用。

我认为最好的方法是使用自定义绑定处理程序,但我不知道如何。

非常感谢您的帮助!

【问题讨论】:

首先它在没有 isEditMode() 条件的情况下工作吗? 我刚刚检查了您的代码及其在 isEditMode 为 false 时的工作情况。您面临的问题是什么? 是的,它可以在没有 isEditMode() 条件的情况下工作。它甚至适用于 isEditMode() 条件,当它设置为 true 时,但如果设置为 false (通过单击我最近添加到上面的按钮) - 我得到一个 ko 错误。 你得到的错误是什么? 鼠标悬停div时发生 【参考方案1】:

您可以通过将一些逻辑移动到视图模型中来简化绑定

<div style="border:1px solid red;width:50px;height:50px"
     data-bind="event: 
        mousedown: down, 
        mouseup:up, 
        mouseover:hover " > </div>

并像这样查看模型

function vm() 
    var self = this;
    this.isEditMode = ko.observable(true);
    down = function() 
        if(this.isEditMode())
        
            console.log("down")
        
    ;
    up = function() 
       if(this.isEditMode())
        
            console.log("up")
        
    ;
    hover = function() 
        if(this.isEditMode())
        
            console.log("hover")
        
    ;


var viewModel = new vm();

ko.applyBindings(viewModel);

【讨论】:

那是我的第一步,但我更愿意阻止可重用的代码。我也想支持更多未来的活动,强迫他们具备这种条件。【参考方案2】:

另一种选择是将条件作为两个单独的块放置在标记本身中,使用“if”绑定来确定显示和绑定哪些条件。

function vm() 
  var self = this;
  self.isEditMode = ko.observable(false); //can be changed to true
  self.events = ko.observable(
    down: function() 
      console.log("down");
    ,
    up: function() 
      console.log("up");
    ,
    hover: function() 
      console.log("hover");
    
  );


ko.applyBindings(new vm());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>

<!--ko if: isEditMode()-->
<div style="border:1px solid red;width:50px;height:50px" data-bind="event:
            mousedown:events().down,
            mouseup:events().up,
            mouseover:events().hover
        ">
  Edit Mode
</div>
<!--/ko-->
<!--ko if: !isEditMode()-->
<div style="border:1px solid red;width:50px;height:50px">
  Read Only
</div>
<!--/ko-->


<button data-bind="click:function()isEditMode(!isEditMode())">change </button>

【讨论】:

以上是关于带有条件的淘汰赛事件绑定的主要内容,如果未能解决你的问题,请参考以下文章

在knockoutjs上绑定按键事件,未填充可观察到

淘汰赛,通过自定义绑定修改时未观察到可观察数组

JavaScript-事件

Vue 指令数据及事件绑定条件和列表渲染

如何在Vue.js中正确添加条件事件绑定?

未捕获的 ReferenceError:无法处理绑定 - 带有淘汰赛的 jquery mobile