我有http://jsfiddle.net/ksCSn/1/
<input type="text" data-bind="
value: title,
hasfocus: edit,
onEnter: stopEdit" />
<p data-bind="text: title"></p>
ko.bindingHandlers.onEnter = {
init: function(element, valueAccessor, _, viewModel) {
ko.utils.registerEventHandler(element, 'keydown', function(evt) {
if (evt.keyCode === 13)
valueAccessor().call(viewModel);
});
}
}
function ViewModel() {
this.title = ko.observable("default value");
this.edit = ko.observable(false);
this.stopEdit = function() {
this.edit(false);
// If the edit update is in a timeout, then it works
// var edit = this.edit;
// setTimeout(function() { edit(false); }, 0);
};
}
ko.applyBindings(new ViewModel());
为什么在输入字段中编辑时按下Enter键,值不会更新?
如果我更改编辑更新以使其排队等待超时,那么它可以工作。那是为什么?
答案 0 :(得分:8)
这是因为Knockout中的“bug”(请参阅https://github.com/SteveSanderson/knockout/issues/321)导致所有绑定一起更新。当您更改edit
属性时,它会更新hasfocus
绑定以模糊字段,并且由于该错误,还会更新value
绑定。由于绑定是按列出的顺序运行的,因此首先更新value
绑定,这将在视图模型中使用值title
覆盖该字段。
修复此问题的一个简单更改是重新排序绑定,以便hasfocus
首先运行:http://jsfiddle.net/mbest/ksCSn/8/
答案 1 :(得分:0)
ValueAccessor是一个函数,它将评估普通属性或ko.observable,具体取决于您传递给绑定的内容。
在您的示例中,您传递的是stopEdit函数,因此:
valueAccessor().call(viewModel)
等于
viewModel.stopEdit.call(viewModel)
将viewModel传递给该函数会将范围从此重置为viewModel。 在您的示例中,这将有效地将viewModel的edit属性设置为false,因此您也可以将其写为
viewModel.edit(false);
这里的问题是你正在混淆事件,请参阅U10的答案,以便更好地解决这个问题。
答案 2 :(得分:0)
按Enter键时应使用Blur,我已调整your JS Fiddle
但是你应该尝试使用另一个事件更新值而不是按Enter键来改变值?例如 afterkeydown :Js Fiddle