Knockout.Js没有检测到以编程方式更改的复选框状态

Geo*_*uer 9 jquery knockout.js

我有一个简单的复选框,其值通过一些基础设施调整,我正在写入localStorage中的持久状态.我知道这通常是通过设置viewModel来完成的,但是基础结构不知道任何敲除绑定并且无法访问它们.

我不认为这会是一个问题,因为我认为淘汰赛已经在'变更'事件中运行,但$checkbox.prop('checked', true).trigger('checked')未能触发我的观察.即使直接使用点击事件也不能满足我的需求.

敲门线会发生什么事?如何让它读取控件的状态?

jsbin在这里展示了这种奇怪的行为.尝试直接选中复选框,然后单击按钮.

Geo*_*uer 1

就我而言,这与 jquery 错误有关。我使用 github淘汰赛问题跟踪器来追踪这个问题;看这里

最终我在我的组件中这样做了:

var isjQueryOld = /^(0|1)\.[0-8]\./.test($.fn.jquery); // <=1.8.*
var toggleCheckbox = isjQueryOld ? jQueryOldToggleCheckbox : function($el) { $el.trigger('click') } //https://github.com/knockout/knockout/issues/987


function jQueryOldToggleCheckbox($el) {
    //This should be simple right? See http://stackoverflow.com/a/8595601/5056
    //and "simulating events to adjust knockout models" jasmine spec
    //all this is nessessary to get everything working with knockout
    var changeTo = !$el.prop('checked');
    if(changeTo)
        $el.attr('checked', true);
    else
        $el.removeAttr('checked');
    $el.trigger('click');
    $el.prop('checked', changeTo);
}
Run Code Online (Sandbox Code Playgroud)

在我的代码中

        toggleCheckbox($el);
Run Code Online (Sandbox Code Playgroud)