使用knockout.js将更改事件绑定添加到输入框时,会在触发事件时将旧值传递给change函数。我可以通过使用模糊来解决这个问题。这是预期的行为吗?是否使用change事件来获取旧值,然后使用普通选择器从dom获取值?这似乎是违反直觉的。
JavaScript
----------
var data = {
saved_value:"1",
value_changed: function(data){
alert(data.saved_value());
}
};
var viewModel = ko.mapping.fromJS(data);
ko.applyBindings(viewModel);
HTML
----
Current Value:<span data-bind="text:saved_value"></span><br/>
<input data-bind="event:{change:value_changed},value:saved_value"></input>
答案 0 :(得分:73)
更新:对于较新版本的淘汰赛,您可以使用textInput替换值绑定,{{3}}处理valueUpdate
未涵盖的许多边缘情况。
不,这不是正确的做事方式。
您获得的旧值是因为saved_value在文本框失去焦点之前不会更新。
如果要在用户输入时推送新值,请使用输入绑定的valueUpdate选项:
<input data-bind="event: { change: value_changed }, value: saved_value, valueUpdate: 'afterkeydown'" />
valueUpdate选项采用事件名称(例如'keyup')。当该事件触发时,您的saved_value将会更新。
现在让我提出一个替代解决方案。
仍然按照上面的说明执行valueUpdate绑定,但是不要监听已更改的事件,只需订阅observable:
<input data-bind="textInput: saved_value" />
然后在JS:
var viewModel = {
saved_value: ko.observable("1"),
};
viewModel.saved_value.subscribe(function (newValue) {
alert(data.saved_value());
});
ko.applyBindings(viewModel);
答案 1 :(得分:10)
如果您将'event'选项放在最后,则不需要'valueUpdate'选项。 像这样:
<input data-bind="value: saved_value, event: { change: value_changed }" />
另请注意,当您使用订阅observable时,每次您的值更改时都会触发它。 (通过用户交互或以编程方式)。
答案 2 :(得分:6)
尝试使用文本和值绑定:
Current Value:<span data-bind="text: saved_value"></span><br/>
<input data-bind="value: saved_value"></input>
并将JavaScript更改为:
var data = {
saved_value: "1"
};
var viewModel = ko.mapping.fromJS(data);
ko.applyBindings(viewModel);
这是一个相关的jsFiddle:http://jsfiddle.net/6zmJs/
如果您想alert()
saved_value
更新后的价值,可以使用ko.computed
或viewModel.saved_value.subscribe(function(value) { alert(value); });
- 尽管这些不是唯一的方法此
答案 3 :(得分:3)
在数据绑定写事件处理程序中,在值处理程序之后而不是之前尝试:
<input data-bind="value: property, event:{ change: doSomething}" />