Knockout js observableArray细微差别



我的代码中有一个错误,我现在已经修复了,但这让我想知道为什么会发生。

问题是我正在使用

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的定义,简单地说,它是一个"推";推送到实际数组并回调其他数组中的所有函数,称为"依赖项";