在IE8中,KnockoutJS 3.2显示实际的可观察函数而不是可观察值



我在IE8中遇到Knockout(v3.2)问题。绑定表达式,如

<div data-bind="text: $data.Property"></div>

-其中Property是可观察的-导致敲除的可观察函数的实际文本显示,而不是Property应该表示的值。

查看规范(用于淘汰的jasmine测试),我发现它们明确不支持IE<9(第442行)https://github.com/knockout/knockout/blob/master/spec/bindingAttributeBehaviors.js#L442

添加括号似乎可以解决IE8text: $data.Property()的问题,但问题是:这会对其他浏览器产生不利影响吗?出于一些常识性的原因,我最初的假设是否定的,但我想知道是否有人知道这方面的解决方案,或者是否添加了括号?

更新1:感谢大家在这一点上的评论。经过进一步调查,问题似乎是加载了重复的javascript文件。

更具体地说,当其他的也被复制时,重复的敲除库导致ViewModel的可观察对象是不同的实例,这意味着它们没有被正确地展开以供显示。

这是通过在敲除库周围添加一个条件来证明的,就像这里建议的那样:阻止IE加载两次动态包含的脚本。添加该条件使得优选的绑定方法(取决于敲除展开可观察性)在IE8中起作用。

到目前为止,我发现的问题/答案在我的情况下都不够,所以我将提出一个新的问题,即如何防止多个淘汰库加载两次。

更新2:新问题发布给那些想跟进的人:如何停止Knockout 3.2库加载两次

我更新了这个问题,但由于从技术上讲这个问题已经得到了回答,我在这里添加了它,这样它就可以在so上继续它的生命周期。

经过进一步调查,问题似乎是加载了重复的javascript文件。

我从IE8淘汰赛开始运行Live Examples。它们使用了首选的非圆括号语法。很明显,淘汰赛就是在那里正确处理事情,所以我从我有问题的页面深入到库中,一步一步地完成每一行。我确认了视图模型的可观测性没有被解开。

展开可观测值的逻辑包括检查要展开的实例是否实际上是可观测值。方法为ko.isObservable。这个检查是说视图模型的可观察性实际上不是可观察器。ko.isObservable方法检查每个实例表示的函数,如果引用匹配,则该方法返回true。这告诉我,这两个函数的实例是不同的。这也表明可能存在重复的ko实例。

查看IE的"网络"选项卡,敲除库被加载了两次。这可以解释为什么视图模型的可观察性和ko.observable实例不同。视图模型使用ko.observable的第一个实例。然后,整个ko实例被淘汰库的第二次加载覆盖(当库加载时,它被执行)。

这是通过在敲除库周围添加一个条件来证明的,就像这里建议的那样:阻止IE加载两次动态包含的脚本。添加该条件使首选绑定语法(取决于敲除展开可观测值)在IE8中起作用。

也就是说,答案是,在这种情况下,简单地添加括号是而不是一个足够的解决方案,而且要么有一个实际的解决方案,要么有一种重复文件加载的解决方案-这是一个单独的问题。

最新更新