【问题标题】:Knockout - Disabling the default behavior of updating model when using binding value with form element淘汰赛 - 使用绑定值与表单元素时禁用更新模型的默认行为
【发布时间】:2015-12-15 21:52:08
【问题描述】:

Knockout 具有默认行为,如果您在编辑输入控件内的值(由 Value 类型的绑定填充)后更改焦点(例如,通过单击输入控件外部),则更新关联模型.

这里是官方文档页面解释的链接,部分参数:

http://knockoutjs.com/documentation/value-binding.html

你知道禁用这种默认行为的方法吗?

这背后的原因:我使用的模型可以通过比较之前的值和新的值来判断他们的最后一次更新是否需要持久备份。 我想在我的表单输入上收听按键事件,但如果我这样做,淘汰赛会触发两次事件(默认一个 + 按键)来更新模型,第二个基本上是告诉我的模型替换值使用相同的值,因为它已经更新,它转换为“由于值没有改变,因此无需进行持久备份”。

我很乐意感谢任何帮助或建议,因为我卡住了,找不到解决办法:)

编辑 无法用裸骨干代码重现错误。似乎“超级酷”说 valueUpdate 应该覆盖当您使用带有绑定值的表单控件时触发的默认 Blur 事件。 这可能是我用来创建 ViewModel 的库 Knockback 引入的错误。

尽管如此,只是用绑定 textInput 替换绑定 Value 就可以了。谢谢大家。

【问题讨论】:

  • 如果您使用 valueUpdate 使用任何事件,默认的将被覆盖。此处示例(检查控制台)jsfiddle.net/LkqTU/28085 .
  • 我无法通过修改您的 jsfiddle.net 代码来证明我所说的。我尝试了以下几行,但不幸的是 keyup 没有触发: self.firstName.subscribe(function(item){console.log('change '+item)}, self, "change"); self.firstName.subscribe(function(item){console.log('keyup '+item)}, self, "keyup");

标签: events knockout.js default


【解决方案1】:

不要监听事件,订阅更新,除非值改变,否则不会触发。使用 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>

【讨论】:

  • 问题可能出在其他地方,但绑定 textInput 工作正常。我会尽快解决这个问题,谢谢:)
猜你喜欢
  • 1970-01-01
  • 2016-06-21
  • 2014-10-07
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 2013-10-31
相关资源
最近更新 更多