从IE8中的observableArray抛出错误中删除项目

时间:2013-12-06 20:10:15

标签: knockout.js internet-explorer-8 ko.observablearray

我一直在使用稍微修改过的jQueryUI版本和observableArrays示例Ryan Niemeyer在这篇博文中整理了http://www.knockmeout.net/2011/05/dragging-dropping-and-sorting-with.html。但是,我注意到当使用最新版本的Knockout(3.0)时,我在运行IE8时尝试从observableArray中删除项目时遇到错误。这是JSFiddle:http://jsfiddle.net/klinden/xFyA2/(请注意,为了在IE8中运行它,您需要使用draft mode)。要复制错误,请尝试抓取列表中的最后一项并将其移动到其他位置。该行发生错误:list.remove(item);错误似乎发生在notifySubscribers的{​​{1}}方法中(第1012行左右)。所有其他浏览器似乎都做得很好,旧版本的Knockout(例如2.2.1)似乎也可以正常工作(即使在IE8中)。

1 个答案:

答案 0 :(得分:3)

我对此进行了一些调查。 KO中有一些代码最终使用未定义的第二个参数调用apply,这会导致旧IE中的错误。

nodesToDelete.push.apply(nodesToDelete, ko.utils.fixUpContinuousNodeArray(mapData.mappedNodes, domNode));

第二个参数未定义,因为拖动元素会使DOM处于意外状态。这可以通过执行“|| []”或始终从fixUpContinuousNodeArray返回数组在KO中“修复”。当我有机会确保我完全理解这个问题时,我会做一些额外的研究,并且会做KO修复(因为它很小)。

现在,我注意到如果您使用sortable插件(https://github.com/rniemeyer/knockout-sortable)和更新版本的jQuery / jQuery UI而不是小提琴,您将不会收到错误。该插件具有针对各种场景的附加功能和错误修复。

以下是更新后的示例:http://jsfiddle.net/rniemeyer/5eVfF/