KnockoutJS 伪绑定在 IE8 中失败

KnockoutJS pseudobinding failing in IE8

本文关键字:失败 IE8 绑定 KnockoutJS      更新时间:2023-09-26

以下内容在IE8中失败,但在实际浏览器中有效

<div data-bind="with: currentItem, visible: currentItemState() === 'view'">
    <!-- ko if: resource().versions().length -->
    <!-- ko with: resource().versions()[0] -->
    <div style="margin-top: 15px;" data-bind="visible: error()">
         .....
    <!-- /ko -->
    <!-- /ko -->

基本上我得到了property 'error' is null or undefined这意味着with(和if)绑定无法正常工作。 这可能是因为IE8正在剥离注释,我已经看到它在其他上下文中这样做,例如在<select>节点中,但我从未见过它在这样的地方这样做。

有没有解决这个问题的好方法(无需通过更改我的 html 结构来解决问题)?

大多数时候,当我遇到这个问题时,它不是归结为淘汰而是 HTML。诸如没有正确关闭标签之类的事情,例如有一个自我关闭的<label />破坏了它。

IE8对这个东西非常讲究。我有一个地方,由于标签问题,它没有渲染<!-- ko if -->的下半部分

将第二个无容器绑定包装在空div 中,以便在所有浏览器中正确解析它

<div data-bind="with: currentItem, visible: currentItemState() === 'view'">
    <!-- ko if: resource().versions().length -->
        <div>
        <!-- ko with: resource().versions()[0] -->
            <div style="margin-top: 15px;" data-bind="visible: error()">
        <!-- /ko -->
        </div>
    <!-- /ko -->
</div>

我不确定是否有适当的方法来解决这个问题,但事实证明,如果 with*ed* 值未定义,则 KNOCKOUT 的with绑定足够智能,根本不渲染节点。 因此,将这两个伪绑定替换为

<div data-bind="with: resource().versions()[0]">

似乎可以解决问题。