Knockout - 在将绑定值与表单元素一起使用时禁用更新模型的默认行为
Knockout - Disabling the default behavior of updating model when using binding value with form element
Knockout 具有 默认行为,如果您在编辑输入控件内的值后更改焦点(例如,通过在输入控件外部单击),则更新关联模型,由Value 类型的绑定。
这里是link到官方文档页面的解释,参数部分:
http://knockoutjs.com/documentation/value-binding.html
您知道禁用此默认行为的方法吗?
这背后的原因:我使用的模型可以通过比较以前的值和新值来判断他们的最后更新是否需要持久备份。
我想听我的表单输入上的按键事件,但如果我这样做,敲除会触发两次事件(默认事件 + 按键)来更新模型,而第二个事件基本上是告诉我的模型替换值相同的值,因为它已经更新,它转换为 "there is no need to do persistent backup since the value didnt change".
我很乐意感谢任何帮助或建议,因为我卡住了,找不到解决方法:)
编辑
无法使用裸 backbone 代码重现错误。似乎 "super cool" 说 valueUpdate 应该覆盖当您使用具有绑定值的表单控件时触发的默认 Blur 事件。
这可能是我用来创建 ViewModel 的库 Knockback 引入的错误。
尽管如此,只需将绑定 Value 替换为绑定 textInput 就可以了。谢谢大家
不监听事件,订阅更新,除非值改变,否则不会触发。使用 textInput
绑定将记录对值的每个更改,即使是那些使用剪切和粘贴等菜单项完成的更改。
同样,您可以将 value
绑定与 valueUpdate: 'input'
一起使用
vm = {
myvar: ko.observable(),
updates: ko.observableArray()
};
vm.myvar.subscribe(function(newValue) {
vm.updates.push(newValue);
});
ko.applyBindings(vm);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<input data-bind="textInput: myvar" />
<div data-bind="foreach: updates">
<div data-bind="text: $data"></div>
</div>
Knockout 具有 默认行为,如果您在编辑输入控件内的值后更改焦点(例如,通过在输入控件外部单击),则更新关联模型,由Value 类型的绑定。
这里是link到官方文档页面的解释,参数部分:
http://knockoutjs.com/documentation/value-binding.html
您知道禁用此默认行为的方法吗?
这背后的原因:我使用的模型可以通过比较以前的值和新值来判断他们的最后更新是否需要持久备份。 我想听我的表单输入上的按键事件,但如果我这样做,敲除会触发两次事件(默认事件 + 按键)来更新模型,而第二个事件基本上是告诉我的模型替换值相同的值,因为它已经更新,它转换为 "there is no need to do persistent backup since the value didnt change".
我很乐意感谢任何帮助或建议,因为我卡住了,找不到解决方法:)
编辑 无法使用裸 backbone 代码重现错误。似乎 "super cool" 说 valueUpdate 应该覆盖当您使用具有绑定值的表单控件时触发的默认 Blur 事件。 这可能是我用来创建 ViewModel 的库 Knockback 引入的错误。
尽管如此,只需将绑定 Value 替换为绑定 textInput 就可以了。谢谢大家
不监听事件,订阅更新,除非值改变,否则不会触发。使用 textInput
绑定将记录对值的每个更改,即使是那些使用剪切和粘贴等菜单项完成的更改。
同样,您可以将 value
绑定与 valueUpdate: 'input'
vm = {
myvar: ko.observable(),
updates: ko.observableArray()
};
vm.myvar.subscribe(function(newValue) {
vm.updates.push(newValue);
});
ko.applyBindings(vm);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<input data-bind="textInput: myvar" />
<div data-bind="foreach: updates">
<div data-bind="text: $data"></div>
</div>