【问题标题】:Custom Styled Checkbox with KnockoutJS does not respond to data-bind 'checked'带有 KnockoutJS 的自定义样式复选框不响应数据绑定“已选中”
【发布时间】:2015-05-10 15:54:19
【问题描述】:

我有一个高级复选框,它根据初始数据被选中或取消选中,然后当用户手动选中或取消选中它时它也会响应。以前对于我更原始的复选框,我真的很喜欢使用来自here 的复选框。

唯一的问题是它不能与 Knockout 一起正常工作。注意初始化自定义复选框时复选框如何不响应。但是,如果您从 JavaScript 底部删除此代码,它会按预期工作。

// INITIALIZE CHECKBOX
$('#witnessSlider').checkboxpicker();

这是一个小提琴:

http://jsfiddle.net/maxgrr/r23q740u/1/

这也适用于各种其他类型的自定义复选框。

【问题讨论】:

    标签: javascript jquery checkbox knockout.js


    【解决方案1】:

    由于您引入了一个自定义插件,该插件将您的本机复选框转换为更复杂的结构,因此内置的 checked binding-handler 不再能够检测到更改,因为它本来可以与 this.checked 一起使用原生 <input type="checkbox" /> 元素(现在已隐藏)。

    因此,您需要一个更能识别插件的处理程序,它能够在自定义复选框发生变化时更新视图模型,并在模型更改时更新插件。

    下面的checkboxpicker 处理程序就是这样做的:init 函数只被调用一次来设置插件,根据当前视图模型状态(wereThereAnyWitnesses 的值)设置它的初始状态并注册一个监听器 (change) 来监听任何将来会更新视图模型的变化。

    update 函数在每次视图模型更改时被调用,并负责相应地更新自定义复选框状态。

    ko.bindingHandlers.checkboxpicker =
    {
        init: function(element, valueAccessor){
            var val = valueAccessor();
            $(element).checkboxpicker().prop('checked', val()).change(function() {
                val(this.checked);
            });
        },
        update: function(element, valueAccessor) {
            var val = valueAccessor();
            $(element).prop('checked', val());
        }
    };
    

    在您的 HTML 中:

    <input type="checkbox" data-bind="checkboxpicker: wereThereAnyWitnesses" />
    

    见Fiddle

    【讨论】:

    • 再一次,我不太了解您解决方案的所有功能,因此感谢任何内联 cmets - 它也可以帮助未来的读者。除此之外,您再次设计了另一个惊人的解决方案。太棒了。不像我,你真的很了解 Knockout 的高级功能。非常感谢。
    • 附带说明,也可以使用这个简单的行来完成:$('#witnessSlider').checkboxpicker().change(function() { murderCaseModel.wereThereAnyWitnesses(this.checked); }); (jsfiddle.net/r23q740u/16)。问题是,在确认移除见证人后,如果您点击“取消”,复选框仍会被选中,所以我认为自定义绑定处理程序方式更清洁。
    • 我同意;自定义绑定处理程序是更好的解决方案,但那一点点 sn-p 代码对其他应用程序很有用,我敢肯定!再次感谢!
    • 老兄,谢谢。为时已晚,无法让我免于头痛,但这是一个很棒的解决方案,而且恰好是我正在使用的库(引导复选框):D 这需要更多的投票。
    猜你喜欢
    • 1970-01-01
    • 2014-05-27
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    相关资源
    最近更新 更多