我认为这个问题类似于one,但就规则而言,如果没有答案且情况不同,我可以提出问题。
我已经通过以下方式简化了我的真实场景,基本上,复选框正在通过一些无法访问的代码进行检查,而这些代码并没有得到knockout.js的视图模型来检测。有工作吗?
HMTL:
<input id="myCheckbox" type="checkbox" data-bind="checked: myValue" />
<div data-bind="text: myValue"></div>
的javascript:
var viewModel = {
myValue: ko.observable(false)
};
ko.applyBindings(viewModel);
setTimeout(function() {
$("#myCheckbox").attr("checked", "checked");
}, 1000);
答案 0 :(得分:0)
您链接的答案解释说,Knockout需要通过常规事件(例如“点击”)提醒您更改。这是Rustam发布的想法:
function update(){
var $cb = $(':checkbox');
var cb = $cb[0];
// change value directly on element
cb.checked = !cb.checked;
// propagate changes to KO
$cb.triggerHandler('click');
}
setTimeout(update, 1000);
当然,对于KO更原生的方法是更改模型上的observable,如下所示:
var update = function() {
viewModel.myValue(!viewModel.myValue)
};
答案 1 :(得分:0)
我无法在我的代码中修复此问题,其中Foundation控制了该复选框。我最终绑定了一个click事件,然后在复选框上检查它是否被选中(我们只有1个复选框,我们试图跟踪)。然后,我根据是否检查了该点击事件更新了observable。
我不知道这件事。
答案 2 :(得分:0)
当使用setAttribute
函数或checked
属性修改复选框时,如jqGrid所做的那样,它不会触发Knockout的click
绑定使用的checked
事件;它也不会触发change
事件。为了能够检测到这些更改,您可以根据浏览器/版本选择不同的选项:MutationObserver
,DOMAttrModified
和/或onpropertychange
。
但我建议避免使用这些解决方案并使用jqGrid gives you:jqGridSelectRow
事件或onSelectRow
回调。您可能想查看应该为您提供良好起点的Knockout-jqGridBinding插件。它包含一个selectedItems
选项,允许您将可观察数组绑定到jqGrid的选定项(在内部使用onSelectRow
回调)。
编辑: 要重新进行迭代,我建议您不要通过查看复选框来尝试解决问题。但是,如果这是你想要的方式,那么有一个jQuery插件,attrchange,为此提供跨浏览器支持。
资源: