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

时间:2015-04-23 13:45:40

标签: javascript knockout.js internet-explorer-8

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

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

- 其中Property是一个可观察的 - 导致挖掘的可观察函数的实际文本显示而不是Property应该代表的值。

观察规格(淘汰赛的茉莉花测试)我发现他们明确地不支持IE的文本节点绑定&lt; 9(第442行)https://github.com/knockout/knockout/blob/master/spec/bindingAttributeBehaviors.js#L442

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

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

更具体地说,虽然其他人也是重复的,但是重复的淘汰库导致ViewModel的可观察对象成为一个不同的实例,这意味着他们没有正确展开以进行显示。

这可以通过在淘汰库周围添加条件来证明,就像这里建议的那样:Stop IE from loading dynamically included script twice。添加条件使得首选绑定方法(取决于敲除展开observable)在IE8中工作。

到目前为止,我发现的所有问题/答案都不足以满足我的需求,所以我会问一个关于如何让多个淘汰库加载两次的新问题。

更新2 :针对想要跟进的人发布新问题:How to stop Knockout 3.2 library loading twice

1 个答案:

答案 0 :(得分:0)

我更新了这个问题,但是,从技术上讲,我已经回答了这个问题,我将其添加到此处,以便它可以在SO上继续使用它的生命周期。

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

我开始在IE8中从淘汰赛中运行Live Examples。这些使用首选的非括号语法。显然淘汰赛是在那里正确处理事情所以我深入潜入图书馆,从我有问题的页面,踩到每一行。我确认viewmodel的可观察量没有被解开。

解包observables的逻辑包括检查要解包的实例是否实际上是一个可观察的。方法是ko.isObservable。此检查表明视图模型的可观察量实际上并不是可观察的。 ko.isObservable方法检查每个实例表示的函数,如果引用匹配,则该方法返回true。这告诉我两个功能的实例是不同的。这也表明可能存在重复的ko个实例。

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

这可以通过在淘汰库周围添加条件来证明,就像这里建议的那样:Stop IE from loading dynamically included script twice。添加条件使得首选的绑定语法(取决于knockout unwrapping observables)在IE8中起作用。

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