KnockoutJS:我应该如何处理繁重的小部件初始化代码?

Posted

技术标签:

【中文标题】KnockoutJS:我应该如何处理繁重的小部件初始化代码?【英文标题】:KnockoutJS: How should I deal with heavy widget initialization code? 【发布时间】:2014-08-15 18:08:13 【问题描述】:

我目前正在尝试优化使用 KnockoutJS 进行视图绑定和呈现的应用程序。我们在以下场景中发现了一个巨大的瓶颈,即数据集大小不断增长:

数据集 (observableArray) 显示在 html 表格中。 同时显示50行。 行模型中的每个字段都是可观察的,因为数据是内联可编辑的(输入、选择、...) 每行存在 8 个使用 Select2 小部件 (http://ivaynberg.github.io/select2) 和 jQuery 日期选择器初始化的选择。

我已经实现了这些 KnockoutJS 性能提示,我在不同的网站上找到了这些提示:

observable 数组与完整的数据集(observable 的调用)一起发布,而不是与多个 push() 调用一起发布。 按照多个站点的建议,我将模板绑定与 foreach 选项结合使用,而不是将两者拆分为单独的绑定。 Datepicker 和 Select2 被实现为自定义剔除绑定处理程序。 ko.applyBindings 直接以 table-element 作为第二个参数调用,因此不是整个 DOM 都被敲除绑定。

但在我看来,主要瓶颈似乎是附加小部件的初始化。我测量了 Select2 小部件的创建过程,大约需要 15 毫秒。当然,这很快就会累积成 50 行和 8 列。因此,对 observable 数组的一次调用以加载完整的数据集最多需要 10 秒!在此期间,浏览器负载过重且无​​响应,这在可用性方面是不可取的。

这引出了我的问题:

有人遇到过类似情况吗?是如何处理的? 有没有更好的方法来初始化带有敲除的第三方小部件? 是否有替代方法(使用 KnockoutJS)来解决此问题?

【问题讨论】:

是否始终需要您的插件(select2 和 datepicker)?或者你可以进入“编辑模式”然后才初始化它们吗? 【参考方案1】:

有人遇到过类似的情况吗?是如何处理的?

我的页面上有一个交互式表格,我使用 HandsOnTable plugin 显示该表格。该表大约有 15 列,我需要显示最多 250 行

我将它绑定到一个observableArray,并且,起初,observableArray 只包含可观察对象。

我对它在我需要维护的旧版本 IE 中的速度不满意(IE8/9,在 IE11/最近的 Chrome 上运行良好),决定删除 @ 中的所有可观察对象987654324@.

这并不是真正的淘汰赛精神,我对这个解决方案并不感到骄傲,但它确实工作得更快。

Handsontable 让您可以处理一些事件,其中我像常规数组一样更新observableArray,然后运行valueHasMutated 函数来通知数组的变化。

同样,我的自定义绑定处理程序监视整个 observableArray 的变化并根据需要更新表。

我认为您的解决方案的另一个区别是 Handsontable 仅在需要时才进入编辑模式,因此插件(如 datepicker)仅在那时加载。

有没有更好的方法来初始化带有敲除的第三方小部件?

也许您只有在选择行/单元格时才能进入编辑模式。然后,您可以使用 if 绑定来初始化并仅显示您的小部件。

【讨论】:

以上是关于KnockoutJS:我应该如何处理繁重的小部件初始化代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理小部件按钮

Flutter Provider select - 如何处理复杂的返回类型,如 List 或 Map

GTK+ 如何处理指针?

如何处理小部件的谷歌登录

如何处理自定义 android 视图/小部件的可见性更改

如何处理 Pytorch 中的小批量损失?