程序化更改不会反映在knockout viewmodel中

Ral*_*alf 3 mvvm knockout.js

使用javascript更改复选框的状态不符合MVVM的精神.但我正在创建一个通用的JavaScript库,以便更好地查看标准控件,如复选框,单选按钮或选择框.基于以下viewmodel:

function MyViewModel() {
  var self = this;

  self.ok = ko.observable();

};

var vm = new MyViewModel();
ko.applyBindings(vm);
Run Code Online (Sandbox Code Playgroud)

但是当我以编程方式更改复选框的选中状态时,我遇到了与淘汰相关的问题:

document.getElementById('chk').checked = true
Run Code Online (Sandbox Code Playgroud)

更改不会出现在viewmodel的属性中.但是当我点击复选框时一切正常.

看看http://jsfiddle.net/KWdZB/1/

有没有解决方法?

nem*_*esv 5

你的问题是ko订阅click检查绑定中的事件:

ko.utils.registerEventHandler(element, "click", updateHandler);
Run Code Online (Sandbox Code Playgroud)

但是更改checked属性不会触发click事件,因此不会通知ko.

如果在属性更改后手动触发click事件,它可以工作...

我不知道如何使用纯javascript,但使用jQuery你可以写:

$('#chk').attr('checked', true).triggerHandler('click')
Run Code Online (Sandbox Code Playgroud)

你可以在这里测试它JSFiddle.