【问题标题】:KnockoutJS template doesn't work in IE8, gives binding errorKnockoutJS 模板在 IE8 中不起作用,出现绑定错误
【发布时间】:2013-05-15 01:40:47
【问题描述】:

我有以下 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-template 的过程中来了。

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

为什么在 IE8 上会失败?

【问题讨论】:

  • 下面的 JsFiddle 也对我有用。也许简化版缺少什么?

标签: internet-explorer-8 knockout.js


【解决方案1】:

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

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

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

在你的例子中,看起来像这样:

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

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

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

【讨论】:

  • 感谢您帮助解决此问题,Thomas。我将你的标记为答案。
【解决方案2】:

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

http://jsfiddle.net/mFLDv/

【讨论】:

  • 嗯。好的。所以简化版缺少一些东西。好的。我会尝试删除一些部分,直到我可以隔离问题。谢谢。
  • 我移动了一些代码,神奇地它开始工作了。我怀疑我在 KnockoutJS 中偶然发现了一个非常小众的错误,但不知道究竟是什么修复了它,很难说。感谢您用小提琴回答,这使我对代码感到困惑,最终解决了问题。标记为答案。
猜你喜欢
  • 1970-01-01
  • 2012-05-14
  • 2015-12-19
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-07
相关资源
最近更新 更多