【问题标题】:Knockout removing item from observableArray throwing error in IE8淘汰赛从 IE8 中的 observableArray 中删除项目抛出错误
【发布时间】:2013-12-07 06:37:59
【问题描述】:

我一直在使用带有 observableArrays 示例的 jQueryUI 可排序的略微修改版本,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); 错误似乎发生在kosubscribablenotifySubscribers 方法中(在第1012 行附近)。所有其他浏览器似乎都可以正常工作,而旧版本的 Knockout(例如 2.2.1)似乎也可以正常工作(即使在 IE8 中)。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    这是一个更新的示例:http://jsfiddle.net/rniemeyer/5eVfF/

    【讨论】:

    • 您也可以通过删除模板中div 周围的空格来修复它(因此模板只包含一个元素)。
    • @MichaelBest - 哦,是的,我应该看看那部分,因为它在过去引起了很多悲伤。不是这个问题的实际“修复”,但我们可能应该确保我们不会在该代码行中使用 undefined 调用 apply。
    猜你喜欢
    • 2013-11-01
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 2013-04-24
    • 1970-01-01
    相关资源
    最近更新 更多