Mvvm 程序更改不会反映在淘汰视图模型中

Mvvm 程序更改不会反映在淘汰视图模型中,mvvm,knockout.js,Mvvm,Knockout.js,使用javascript更改复选框的状态与MVVM的精神不符。但我正在创建一个通用javascript库,用于更好地查看标准控件,如复选框、单选按钮或选择框。 基于以下viewmodel: function MyViewModel() { var self = this; self.ok = ko.observable(); }; var vm = new MyViewModel(); ko.applyBindings(vm); 但是,当我以编程方式更改复选框的选中状态时,我会遇

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

function MyViewModel() {
  var self = this;

  self.ok = ko.observable();

};

var vm = new MyViewModel();
ko.applyBindings(vm);
但是,当我以编程方式更改复选框的选中状态时,我会遇到与敲除相关的问题:

document.getElementById('chk').checked = true
更改将不会显示在viewmodel的属性中。但是当我点击复选框时,一切都正常


有什么解决方法吗?

您的问题是ko订阅了以下内容中的
单击
事件:

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

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

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

$('#chk').attr('checked', true).triggerHandler('click')

您可以在此中进行测试。

这是正常的,因为选中的绑定处理程序不订阅选中的更改事件,而是订阅单击事件处理程序(您可以在源文件的选中绑定处理程序代码中看到)

如果您需要通过单击更改值,则必须使用ok observable值

这是HTML

<div>
    <input type="checkbox" id="chk" data-bind="checked: ok"/><br>
    <input type="button" id="btnCheck" value="Check" data-bind="click: Check"/>&nbsp;&nbsp;    
    <input type="button" id="btnUnCheck" value="Uncheck" data-bind="click:Uncheck"/> 
</div>
<div>
    Value: <span data-bind="text: ok"></span>    
</div>
​ ​ 你可以在这里看到它。

我给它一个+1:)对于纯js,你只需做
document.getElementById('chk')。单击&&document.getElementById('chk')。单击()
<div>
    <input type="checkbox" id="chk" data-bind="checked: ok"/><br>
    <input type="button" id="btnCheck" value="Check" data-bind="click: Check"/>&nbsp;&nbsp;    
    <input type="button" id="btnUnCheck" value="Uncheck" data-bind="click:Uncheck"/> 
</div>
<div>
    Value: <span data-bind="text: ok"></span>    
</div>
function MyViewModel() {
    var self = this;

    self.ok = ko.observable();

    self.Check = function(){
      self.ok(true);      
    }

    self.Uncheck = function(){
        self.ok(false);            
    }
};

vm = new MyViewModel();
ko.applyBindings(vm);