Knockout.js observableArray两种push方式的绑定表现差异疑问
你的猜测完全正确,核心就是Knockout两种绑定的依赖追踪与更新机制存在差异:
observableArray的本质:Knockout的observableArray是包装原生数组的函数,
this.reasons()会直接返回底层的原生数组。你调用原生数组的push方法时,observableArray本身完全感知不到数组内容的变化,自然不会触发任何变更通知。foreach绑定的更新逻辑:
foreach绑定除了订阅observableArray的变更事件外,还有一个特性——只要页面中存在其他observable值发生变化(触发了依赖更新周期),它就会重新读取数组的当前值并重新渲染。所以你修改底层数组后,哪怕有其他无关操作触发了视图更新,foreach都会显示出更新后的数组内容。options绑定的更新逻辑:
options绑定只认observableArray自身触发的change事件。只有当你调用observableArray封装好的push/pop/splice等方法,或者直接给this.reasons赋值新数组时,observableArray才会发出变更通知,options绑定才会重新生成下拉选项。直接修改底层原生数组,observableArray不会发送通知,所以options完全不会更新。
总结:你直接修改底层数组的操作,没有触发observableArray的官方变更通知,foreach因为有额外的重新渲染触发条件能显示更新,而options只依赖observableArray的变更通知,所以没反应。
内容的提问来源于stack exchange,提问作者LMM

