Mvvm 带条件的敲除事件绑定

Mvvm 带条件的敲除事件绑定,mvvm,knockout.js,Mvvm,Knockout.js,我想使用敲除“事件”绑定将一些事件绑定到元素 但我希望列出的所有事件都只与一个特定案例相关联 viewmodel: 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:

我想使用敲除“事件”绑定将一些事件绑定到元素 但我希望列出的所有事件都只与一个特定案例相关联

viewmodel:

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>

但这对我不起作用

我认为最好的方法是使用自定义BindingHandler,但我不知道怎么做


非常感谢你的帮助

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

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

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

函数vm(){
var self=这个;
self.isEditMode=ko.observable(false);//可以更改为true
self.events=ko.observable({
下:函数(){
控制台。登录(“关闭”);
},
up:function(){
控制台。登录(“up”);
},
悬停:函数(){
控制台日志(“悬停”);
}
});
}
应用绑定(新vm())

编辑模式
只读

更改
首先,它在没有isEditMode()条件的情况下工作吗?我刚刚检查了您的代码,以及它在isEditMode为false时的工作情况。您面临的问题是什么?是的,它在没有isEditMode()条件的情况下工作。它甚至可以与isEditMode()条件一起工作,当它设置为true时,但如果设置为false(通过单击我最近添加到上面的按钮),我会得到一个ko错误。然后您会得到什么错误?当鼠标悬停在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);