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

In IE8, KnockoutJS 3.2 displaying actual observable function rather than the observable's value

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

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

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

查看规范(Jasmine 的淘汰赛测试)我发现它们明确不支持 IE < 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。添加条件使得首选绑定方法(依赖于 knockout unwrapping observables)在 IE8 中工作。

None 的 questions/answers 到目前为止,我发现在我的情况下就足够了,所以我会问一个新问题,关于如何防止多个基因敲除库加载两次。

更新 2: 新问题已发布给那些想跟进的人:

我更新了这个问题,但是,由于从技术上讲这个问题得到了回答,我将它添加到这里,以便它可以继续它的生命周期。

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

我从 运行 IE8 中的 Live Examples 开始。这些使用首选的非括号语法。显然,knockout 正在正确处理那里的事情,所以我从有问题的页面深入到图书馆,逐行检查每一行。我确认 viewmodel 的 observables 没有被展开。

解包 observable 的逻辑包括检查要解包的实例是否实际上是一个 observable。方法是ko.isObservable。此检查表明视图模型的可观察对象实际上不是可观察对象。 ko.isObservable 方法检查每个实例代表的函数,如果引用匹配,则方法 returns 为真。这告诉我这两个函数的实例是不同的。这也表明可能存在重复的 ko 个实例。

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

这是通过在敲除库周围添加一个条件来证明的,就像这里建议的那样:Stop IE from loading dynamically included script twice。添加条件使得首选绑定语法(依赖于 knockout unwrapping observables)在 IE8 中工作。

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