mvvm - 编程更改不会反射(reflect)在 knockout View 模型中

标签 mvvm knockout.js

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

function MyViewModel() {
  var self = this;

  self.ok = ko.observable();

};

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

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

document.getElementById('chk').checked = true

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

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

有什么解决方法吗?

最佳答案

您的问题是 ko 订阅了 checked binding 中的 click 事件:

ko.utils.registerEventHandler(element, "click", updateHandler);

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

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

我不知道如何用纯 javascript 做到这一点,但你可以用 jQuery 写:

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

你可以在这个JSFiddle中测试.

关于mvvm - 编程更改不会反射(reflect)在 knockout View 模型中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13008283/

相关文章:

wpf - 用于关闭 View 的 ViewModel 命令的 Cinch 版本

javascript - Bootstrap 类 ="table"不起作用

javascript - es6 方法内部和外部构造函数 - knockout

knockout.js - 将 knockoutjs 对象移动到弹出编辑表单中

javascript - JSON 表示法和分配给对象有什么区别?

c# - VisualStateGroup的ViewModel方法事件

c# - 如何对BackgroundWorker + PRISM InteractionRequest进行单元测试?

c# - 如何在 XAML 中绑定(bind) ObservableCollection 的属性

c# - 从第二个 lib 项目绑定(bind)用户控件不起作用 - wpf mvvm

javascript - 使用 knockout.js 将 Flash 新元素添加到 dom 中的数组