以编程方式设置时,已检查状态未在viewmodel中填充

时间:2013-07-16 18:20:22

标签: javascript knockout.js jqgrid

我认为这个问题类似于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);

3 个答案:

答案 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事件。为了能够检测到这些更改,您可以根据浏览器/版本选择不同的选项:MutationObserverDOMAttrModified和/或onpropertychange

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

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

资源:

  1. Knockout-jqGridBinding:https://github.com/CraigCav/Knockout-jqGridBinding
  2. attrchange:http://meetselva.github.io/attrchange/