我在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。
1条答案
按热度按时间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()
中看到它:第一次