IE 9版本之前会出现错误"Expected identifier, string or number".

6
这个 knockout 2.1 绑定表达式在 Firefox 和 IE9 上运行良好,但在 IE9 兼容模式下崩溃,并显示错误 "Expected identifier, string or number"。
<div data-bind="template: {
    if: myDataModel, 
    data: myDataModel, 
    afterRender: setup(myDataModel) }">

我在调试器下找到了实际的位置,就在这行代码中(knockout-2.1.0.debug.js):

return new Function("sc", functionBody)
functionBody 是一个等于上述表达式的字符串。我尝试过在空格和换行符之间进行调整,但没有帮助,结果相同:在IE9兼容模式下与其他浏览器相比有不同的结果。

有什么建议吗?

1个回答

12

我认为问题在于旧版本的IE不喜欢"if"或类似的保留字作为属性名出现。尝试在属性名周围加上单引号。

<div data-bind="template: {
'if': myDataModel, 
data: myDataModel, 
afterRender: setup(myDataModel) }">

当您使用“class”绑定时,可能会遇到这种常见情况。同样的修复方法:

<tr data-bind="attr: { 'class': packageSelected() ? 'success' : '' }">

JS中的保留字列表:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Reserved_Words


你是完全正确的,现在加上 'if' 表达式后它可以正常工作了。 Knockout.js 的文档没有提到这一点,在他们的网站 http://knockoutjs.com 上所有 if 语句的示例都没有引号,尽管他们声称该框架可以从 IE6+ 开始使用,但这似乎并不正确。 - YMC
1
@YMC:在内部,knockout确保所有绑定中的顶级属性都被引用。但对于嵌套的对象字面量,就无法做到同样的处理。这就是为什么普通的knockout if绑定似乎没有任何问题的原因。你只需养成为这些对象引用属性名称的习惯即可。 - Jeff Mercado
@Jeff Mercado 我明白了,但我的抱怨并不是关于缺乏错误消息,而是关于他们自己网站上缺少对if语句进行引用的示例。 - YMC
@YMC:好像没有使用 if 设置进行 template 绑定的示例,我只看到了普通顶层 if 绑定的示例。文档中一定要注明这一点。 - Jeff Mercado
1
我在IE8中遇到了与“for”属性类似的问题。如果我将其放入引号中('for'),则会出现错误,指出“您无法多次向同一元素应用绑定”。 - Azimuth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接