我的代码中有一个错误,我现在已经修复了,但这让我想知道为什么会发生。
问题是我正在使用
this.reasons().push({ label: reason, value: reason })
(原因是可观察阵列(
而不是:
this.reasons.push({ label: reason, value: reason });
然而,这是有道理的,让我完全摆脱气味的是使用了一个ul标签,比如:
<ul class="dropdown-menu" aria-labelledby="dropdownMenu1" data-bind="foreach: options">
与第一种推送到阵列的方法一起工作,但是:
<select
data-bind="options: options, value: selected, optionsText: getText, valueAllowUnset: true, optionsAfterRender: processDisabled"></select>
没有。我的最佳猜测是,当使用foreach数据绑定并获取对数组的更改时,敲除依赖性跟踪的工作方式会有所不同。使用推送到observableArray的第二种方法会通知所有侦听器,而不考虑这些细微差别。
有人能确认解释原因并告诉我原因吗?
谢谢!
请注意,当您评估this.reasons()
时,只剩下一个普通的js数组,您可以将其推到上面。Knockout没有意识到这一变化,因为您正在推动香草数组,而不是observableArray实例。
在第二次尝试中,您正在评估observableArray对push的定义,简单地说,它是一个"推";推送到实际数组并回调其他数组中的所有函数,称为"依赖项";