knockout.js 敲除值绑定输入类型上的异常行为

wydwbb8l  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(189)

我在KO foreach中有两个同级输入:

<input type="text" name="background_color"  data-bind="value: $data.background_color">
<input type="hidden" name="background_color"  data-bind="value: $data.background_color">

生成的DOM如下所示:

<input type="text" name="background_color" data-bind="value: $data.background_color">
<input type="hidden" name="background_color" data-bind="value: $data.background_color" value="#c9311b">

我是通过jQuery的html函数获得的,然后在其他地方使用该HTML,但是当我在其他地方使用它时,文本输入的值没有设置。
我的修复方法是使用attr绑定,这样就可以了

data-bind="attr: {'value':$data.background_color}"

但这很痛苦,为什么只为input[type="hidden"]设置值?
使用KO v3.3.0。

qpgpyjmq

qpgpyjmq1#

文本输入的 * current * 值根本不会反映在DOM的元素/属性级别上,因此innerHTML或jQuery的html()不会看到它。
解决方案,但首先让我们看看value的行为,以及type="text"type="hidden"的不同之处。

value属性与value属性

value属性不是文本输入的值,它是文本输入的 * default * 值。设置文本输入的值并不会设置该属性。相反,对于 * hidden * 输入来说,区分"default value"和"current value"没有意义,因此设置value属性 * 会 * 设置该属性。因此可以在生成HTML中看到这些属性。
value的这种行为与KO无关,它只发生在原始DOM操作中:
第一个
HTML5规范在这里介绍了value属性及其不同的模式:
value IDL属性允许脚本处理输入元素的值。该属性处于以下模式之一,这些模式定义了它的行为:

    • 数值**

在获取时,它必须返回元素的当前值。在设置时,它必须将元素的值设置为新值,将元素的脏值标志设置为true,如果元素的type属性的当前状态定义了值清理算法,则调用值清理算法,然后,如果元素具有文本输入光标位置,则应将文本输入光标位置移动到文本字段的末尾。取消选择任何选定的文本并将选择方向重置为无。

    • 预设值**

在获取时,如果元素具有value属性,则它必须返回该属性的值;否则必须返回空字符串,设置时必须将元素的value属性设置为新值。
... (还有几种其他模式)
......在这里,它说input type="hidden"value使用"默认"模式,但input type="text"使用"值"模式(您必须向下滚动一点到"IDL属性和方法"表; value是列出的第三个)。

溶液

正如您所发现的,解决方案是确保设置value属性。您 * 可以 * 使用attr绑定来实现这一点,正如您所提到的,但这有点麻烦。相反,您可以为自己提供custom binding,它设置值 * 和 * 默认值;由于默认值在DOM中反映为value属性,因此您将在html()中看到它:
第一次

相关问题