0

我相信这个问题与这个问题相似就规则中所见,如果没有答案并且情况不同,我可以问。

我已经通过以下方式简化了我的真实场景,基本上,复选框正在通过一些无法访问的代码进行检查,这些代码无法检测到 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);
4

3 回答 3

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)
};
于 2013-07-16T18:28:00.637 回答
0

我无法在 Foundation 控制复选框的代码上解决此问题。我最终绑定了一个点击事件,然后选中了复选框以查看它是否被选中(我们只有一个我们试图跟踪的复选框)。然后,我根据是否检查了该点击事件更新了 observable。

我所知道的没有办法解决这个问题。

于 2013-07-16T21:25:53.950 回答
0

当使用setAttribute函数或checked属性修改复选框时,就像 jqGrid 所做的那样,它不会触发clickKnockoutchecked绑定使用的事件;它也不会触发change事件。为了能够检测到这些更改,您可以根据浏览器/版本选择不同的选项:MutationObserverDOMAttrModified和/或onpropertychange

但我建议避免使用这些解决方案并使用jqGrid 为您提供的:jqGridSelectRow事件或onSelectRow回调。您可能想查看Knockout-jqGridBinding插件,它应该会给您一个很好的起点。它包括一个selectedItems选项,允许您将可观察数组绑定到 jqGrid 的选定项(在onSelectRow内部使用回调)。

编辑:要重新迭代,我建议您不要尝试通过查看复选框来解决问题。但是,如果这是您想要的方式,那么有一个 jQuery 插件attrchange可以为此提供跨浏览器支持。

资源:

  1. Knockout-jqGridBinding:https ://github.com/CraigCav/Knockout-jqGridBinding
  2. attrchange:http ://meetselva.github.io/attrchange/
于 2013-07-17T20:27:03.890 回答