Knockout.js 如何使用泛型“否定敲除中的isVisible绑定”;不是";结合

Knockout.js 如何使用泛型“否定敲除中的isVisible绑定”;不是";结合,knockout.js,knockout-2.0,Knockout.js,Knockout 2.0,是否可以使用Knockout实现“not”绑定?基本上,我想否定绑定值,但保留双向绑定/可观察性 在我的视图模型中,我有一个属性,isVisible,但我的UI要求我提供一个复选框来表示隐藏或“不可见”状态。我不希望创建重复的或第二个属性来跟踪否定状态 像这样的代码不能完全工作,因为它不能将可观察对象传递给绑定: <label>Is Hidden?<input type="checkbox" data-bind="checked: !isVisible()" /><

是否可以使用Knockout实现“not”绑定?基本上,我想否定绑定值,但保留双向绑定/可观察性

在我的视图模型中,我有一个属性,
isVisible
,但我的UI要求我提供一个复选框来表示隐藏或“不可见”状态。我不希望创建重复的或第二个属性来跟踪否定状态

像这样的代码不能完全工作,因为它不能将可观察对象传递给绑定:

<label>Is Hidden?<input type="checkbox" data-bind="checked: !isVisible()" /></label>
是隐藏的吗?
注意:这是一个问答式的问题-尽管我发布了一个答案,但我也对任何不同或改进的答案非常感兴趣

这里有一个“非”绑定,可以用于任何单个参数“bool”类型的绑定,例如
选中的
可见的
启用的
,等等

使用如下绑定:

<input type="checkbox" data-bind="not: {checked: isVisible}" /> 
我并没有真正尝试过打磨装订,但它似乎功能齐全

ko.bindingHandlers.not = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        //expects a single, truthy/falsy binding, 
        //    such as checked, visible, enable, etc.
        var binding = valueAccessor();
        var observable = binding[Object.keys(binding)[0]];
        var notComputed = ko.computed({
            read: function () {
                return !observable();
            },
            write: function (newValue) {
                observable(!newValue);
            }
        });
        var newBinding = {};
        newBinding[Object.keys(binding)[0]] = notComputed;
        ko.applyBindingsToNode(element, newBinding, viewModel);
    }
};