Knockout.js 敲除可观察数组-推送元素冻结Firefox和IE11中的UI

Knockout.js 敲除可观察数组-推送元素冻结Firefox和IE11中的UI,knockout.js,Knockout.js,我有一个web应用程序,它使用Knockout 3.4和其他库(inversifyJS、Knockout.validation、axios、jQuery) 从昨天开始,我在尝试用axios和淘汰可观察数组填充选择列表时遇到了一个巨大的性能问题 下面是简化的JSFIDLE,它显示了我正在做的事情: 如果我在JSFIDLE中运行这段代码,它的执行速度会非常快。 如果我将此代码插入到我的应用程序中,需要6秒钟以上的时间,IE11和Firefox中的UI才会再次响应 似乎什么都帮不了我,我也不知道我还

我有一个web应用程序,它使用Knockout 3.4和其他库(inversifyJS、Knockout.validation、axios、jQuery)

从昨天开始,我在尝试用axios和淘汰可观察数组填充选择列表时遇到了一个巨大的性能问题

下面是简化的JSFIDLE,它显示了我正在做的事情:

如果我在JSFIDLE中运行这段代码,它的执行速度会非常快。 如果我将此代码插入到我的应用程序中,需要6秒钟以上的时间,IE11和Firefox中的UI才会再次响应

似乎什么都帮不了我,我也不知道我还能做什么。 我尝试了“速率限制”和“延迟更新”,但没有任何改变


有人知道问题出在哪里吗?我可以做些什么来调试这个问题吗?为什么它在JSFIDLE中的行为会有所不同?

除非您要添加到数组中,为什么不试试呢

 viewModel.availableCountries(data);


选择列表html元素是否以某种方式使用css设置样式?渲染性能并不总是与js问题相关。如果您对选择列表或周围的元素有一些丰富的设计,那么显示计算也会减慢速度。删除样式并再次检查。已尝试删除样式,但无效。我还试图改变填充可观察数组的方法。所有可用的方法都不会改变任何东西。如果我用jQuery(没有敲除)填充select列表,它仍然非常慢。我可以在浏览器开发工具中看到“searchPseudoElements”方法是性能不佳的原因。您能解释一下执行这两种方法的好处吗?看来他已经在使用
arrayPushAll
实用程序功能了。@JasonSpake viewModel.availableCountries(data);将用新阵列覆盖该阵列,并将通知订阅者。viewModel.availableCountries.push(数据)将添加到数组的末尾,这将通知所有订阅者。如果我们使用ko.utils.arrayPushAll,我们需要在observableArray上调用valueHasMutated()来通知订阅方。@RoyJ干杯,我将修改答案。
 viewModel.availableCountries(data);
 ko.utils.arrayPushAll(viewModel.availableCountries(),data); 
 viewModel.availableCountries.valueHasMutated();