为啥在刷新 Options 淘汰 observableArray 时我的 Select 值被取消选择(并且原始值仍然存在)?

Posted

技术标签:

【中文标题】为啥在刷新 Options 淘汰 observableArray 时我的 Select 值被取消选择(并且原始值仍然存在)?【英文标题】:Why is my Select value deselected when the Options knockout observableArray is refreshed (and the original value is still present)?为什么在刷新 Options 淘汰 observableArray 时我的 Select 值被取消选择(并且原始值仍然存在)? 【发布时间】:2020-10-14 13:45:57 【问题描述】:

我使用 observable 作为我的值,使用 observableArray 作为我的选项。

更新选项时,会取消选择该值,即使旧值存在于刷新的列表中。

是否有某种方法可以确保在更改选项时重新选择该值?我以为这会自动发生,不知道这是否是预期的。

我的代码:

选择字段:https://github.com/stantond/OctoPrint-AirQuality/blob/9f0ddb275d17991811e80e1007840eb6d345c967/octoprint_airquality/templates/airquality_settings.jinja2#L125

计算选项数组:https://github.com/stantond/OctoPrint-AirQuality/blob/9f0ddb275d17991811e80e1007840eb6d345c967/octoprint_airquality/static/js/airquality.js#L25

日志输出:https://community.octoprint.org/uploads/default/original/2X/9/93a1e5959a6c2f8a22a0bf68592be766140fb4f9.png

【问题讨论】:

你所描述的当然是可能的。如果您在数组第一次填充其选项之前设置了可观察对象,则该值将被清除,因为该值当时不在列表中。如果您的 observable 存储的是完整对象而不是值类型,这也可能是一个等效问题。您必须展示您的一些代码或复制 sn-p。 谢谢,我添加了一些代码链接。我希望这是一个我没有足够经验发现的等效问题,但我认为还有其他事情发生。 【参考方案1】:

我想我已经解决了。

这是需要使用 ko.toJS(oldValue) 来确保类型相同,并在 Select 字段中将 valueAllowUnset 设置为 true 的组合,以便在选项菜单没有的那一刻赶上,旧值不会过早清除。

【讨论】:

以上是关于为啥在刷新 Options 淘汰 observableArray 时我的 Select 值被取消选择(并且原始值仍然存在)?的主要内容,如果未能解决你的问题,请参考以下文章

对象键值更改时刷新 UI - 淘汰赛

我不知道为啥我必须在这个淘汰赛 observable 数组上调用 valueHasMutated

为啥JQuery被淘汰了?

为啥我的淘汰视图模型使用不同的值初始化?

为啥 Angular 6 不发送 HTTP Get/Post 请求?

在带有淘汰赛的选择中更改事件