0

我有一个绑定到我的 KOJS 模型的复选框。

<input type="checkbox" data-bind="checked:settings.remember">

当用户更改复选框的值时,我正在尝试更新数据库。但是,视图模型在这些 jQuery 函数之后更新:

$("input[type='checkbox']").click(function(){ });

$("input[type='checkbox']").change(function(){ });

$("input[type='checkbox']").mouseup(function(){ });

换句话说,当我在这些函数中查看我的 viewModel 时,它会在用户更改复选框之前返回复选框的值。因此,如果复选框曾经为真,现在告诉我为假(并显示为假),viewModel 仍将显示为真。

在绑定发生后,我是否可以使用其他一些 jQuery 函数?或者你能想到在我的 viewModel 变量改变后调用函数的任何其他聪明的方法吗?请注意,我当前的 viewModel 声明是:

var viewModel = {};
//...get some data from AJAX calls
ko.mapping.fromJSON(data, viewModel.'+file+');

其中文件是一些动态值(我从多个数据库中绘制我的视图模型)

我可以使用下面的 hacky 解决方案来解决上述问题(请参阅我的答案),但 RP Niemeyer 的回答表明手动订阅有更好的方法。到目前为止,我还无法弄清楚在我的 viewModel 中定义事物以及使用映射插件。

到目前为止,这是我的代码,当然,它不适用于 JSFiddle。

4

2 回答 2

2

一般来说,这类事情的一个不错的选择是在您的视图模型本身中处理它。例如,您可以使用手动订阅settings.remember如果它是可观察的)并触发您的数据库调用。

settings = {
  remember: ko.observable(false)
};

settings.remember.subscribe(function(newValue) {
    //run your logic here
}, settings);

调用的第二个参数subscribe确定this函数运行时间的值。

如果您真的被迫与在 Knockout 之外更改的字段进行交互,那么您可能希望连接一个“更改”处理程序,但要等到调用 ko.applyBindings 之后。然后,您的更改事件处理程序将在 Knockout 已添加到元素的更改处理程序之后运行。但是,如果您的内容在模板中并被重新渲染,那么您的处理程序将会丢失。

我强烈建议使用手动订阅方法。

于 2012-12-27T18:20:02.983 回答
0

RP Niemeyer 上面的回答可能比这要好得多,但这是我解决了我的问题的临时修复:

$("input[type='checkbox']").click(function() {
  viewModel.settings.remember($(this).is(":checked"));';
  //...AJAX it away
});
于 2012-12-27T18:25:08.990 回答