1

我有以下 KnockoutJS 2.0 代码,在所有现代浏览器中都可以正常工作,但在 IE8 上失败。

这是简化的代码:

<table>
   <tr>
       <td data-bind="template: { foreach: fooItems, name: 'foo-template' }></td>
       <td data-bind="template: { foreach: barItems, name: 'foo-template' }></td>
   </tr>
</table>

<script id="foo-template" type="text/html">
   <div data-bind="click: SomeMethod">
       foobar
   </div>
</script>

<script type="text/javascript">

   var viewModel = {
       fooItems: ko.observableArray(),
       barItems: ko.observableArray(),
   }
   ko.applyBindings(viewModel);

</script>

这在 IE9、Chrome、Firefox 上运行良好。

但是,在 IE8 上,我收到以下错误:

“无法解析绑定。SomeMethod 未定义。”

在 IE8 中调试它,我看到以下信息:

在此处输入图像描述

它即将抛出异常,并且在 foo 模板的渲染过程中到来。

注意 $data 是未定义的。这就是 SomeMethod 无法解决的原因;它应该存在于 $data.SomeMethod 上,但 $data 未定义。

为什么这在 IE8 上失败了?

4

2 回答 2

7

我遇到了完全相同的问题,并且很失望地看到您在不知道如何解决问题的情况下解决了您的问题。

所以,对于未来的访客,我是这样解决这个问题的:

我已经用硬编码数组初始化了 foreach 中使用的数组,以尾随昏迷结尾。

在您的示例中,这看起来像这样:

viewModel.fooItems([
    {SomeMethod: function () {}},
    {SomeMethod: function () {}},   // <- here is the evil coma
]);

仔细观察,ie8 将此数组评估为 3 项数组,其最后一项未定义。因此未定义的 $data。

当然,有相同的症状并不意味着你的问题是一样的,但如果它可以帮助任何人......

于 2013-01-07T20:50:59.623 回答
1

我用IE8在jsfiddle中试过你的例子,没问题

http://jsfiddle.net/mFLDv/

于 2012-04-19T10:58:26.877 回答