【问题标题】:KnockoutJS binding fails in IE8KnockoutJS 绑定在 IE8 中失败
【发布时间】:2012-05-14 09:24:59
【问题描述】:

以下敲除绑定在真实浏览器中运行良好,但在 IE8(和兼容模式下的 IE9)中失败

<li data-bind="attr: { class: id() == $root.currentItem().id() ? 'active' : '' }"> 

有谁知道为什么,我该如何解决?


这是整个代码,如果有帮助的话:

<div class="toc-outer">
    <ol id="table-of-contents" data-bind="sortable: { data: list, template: 'listTemplate', allowDrop: false, isEnabled: false }" class="toc toc-tree"></ol>
</div>

<script id="listTemplate" type="text/html">
    <li data-bind="attr: { class: id() == $root.currentItem().id() ? 'active' : '' }">
        <div data-bind="attr: { class: 'dropdown' + (id() == $root.currentItem().parentId() ? ' active' : '') }">
            <a href="#" class="toggle">
                <i data-bind="visible:children().length > 0, attr: { class: 'icon-toggle icon-minus hide' + (id() == $root.currentItem().id() ? ' icon-white' : '') }"></i>
            </a>
            <a class="dropdown-toggle menu"
                href="#"
                data-bind="visible:$root.allowEditing"
                data-toggle="dropdown">

                <i data-bind="attr: { class: 'icon-menu icon-list-alt hide' + (id() == $root.currentItem().id() ? ' icon-white' : '') }"></i>
            </a>
            <a class="name" data-bind="attr: {href: hash}">
                <i data-bind="visible: type() == 'settings', attr: { class: 'icon-type icon-settings icon-home' + (id() == $root.currentItem().id() ? ' icon-white' : '') }"></i>
                <i data-bind="visible: type() == 'video', attr: { class: 'icon-type icon-video icon-facetime-video' + (id() == $root.currentItem().id() ? ' icon-white' : '') }"></i>
                <i data-bind="visible: type() == 'data', attr: { class: 'icon-type icon-data icon-signal' + (id() == $root.currentItem().id() ? ' icon-white' : '') }"></i>
                <i data-bind="visible: type() == 'file', attr: { class: 'icon-type icon-file icon-download-alt' + (id() == $root.currentItem().id() ? ' icon-white' : '') }"></i>
                <i data-bind="visible: type() == 'test', attr: { class: 'icon-type icon-test icon-ok-sign' + (id() == $root.currentItem().id() ? ' icon-white' : '') }"></i>
                <span data-bind="text:name"></span>
                <span class="badge draft" data-bind="visible:status() == 'draft'">D</span>
            </a>
            <dl class="dropdown-menu" data-bind="visible:$root.allowEditing">
                <dd><a href="#" data-bind="visible: parentId() !== 0 && !topLevelChild(), click: moveOut" data-toggle="pill" data-target="#item-pane" title="#{TocMoveOut}" class="moveItemOut">#{TocMoveOut}</a></dd>
                <dd><a href="#" data-bind="visible: parentId() !== 0 && !firstSibling(), click: moveIn" data-toggle="pill" data-target="#item-pane" title="#{TocMoveIn}" class="moveItemIn">#{TocMoveIn}</a></dd>
                <dd data-bind="visible: parentId() !== 0 && (!topLevelChild() || !firstSibling())" class="divider"></dd>
                <dd><a href="#" data-toggle="pill" data-target="#item-pane" title="#{TocEdit}" class="edit">#{TocEdit}</a></dd>
                <dd data-bind="visible: parentId() !== 0"><a href="#" class="remove">Remove</a></dd>
                <dd class="divider"></dd>
                <dd><a href="#page" data-toggle="pill" data-target="#item-pane" title="#{TocAddPage}" class="add">#{TocAddPage}</a></dd>
                <dd><a href="#video" data-toggle="pill" data-target="#item-pane" title="#{TocAddVideo}" class="add">#{TocAddVideo}</a></dd>
                <dd><a href="#file" data-toggle="pill" data-target="#item-pane" title="#{TocAddFile}" class="add">#{TocAddFile}</a></dd>
                <dd><a href="#test" data-toggle="pill" data-target="#item-pane" title="#{TocAddTest}" class="add">#{TocAddTest}</a></dd>
                <dd><a href="#data" data-toggle="pill" data-target="#item-pane" title="#{TocAddData}" class="add">#{TocAddData}</a></dd>
                <dd class="divider"></dd>                                
                <dd><a href="#library" data-toggle="pill" data-target="#item-pane" title="#{TocAddLibrary}" class="add add-from-library">#{TocAddLibrary}</a></dd>
            </dl>                            
        </div>
        <span class="divider" data-bind="visible: type() == 'settings'"></span>
        <ol class="toc-child" data-bind="sortable: {template: 'listTemplate', data:children, isEnabled: $root.allowEditing(), beforeMove: beforeTreeItemMove, afterMove: tocSorted, allowDrop: false }"></ol>
    </li>
</script>

【问题讨论】:

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


    【解决方案1】:

    似乎IE8被class这个词弄糊涂了,所以它需要用引号引起来。所以

    <li data-bind="attr: { class: id() == $root.currentItem().id() ? 'active' : '' }">
    

    变成

    <li data-bind="attr: { 'class': id() == $root.currentItem().id() ? 'active' : '' }">
    

    【讨论】:

    • +1 这很有帮助。我还发现 switch 这个词会导致同样的错误,即使在模板中使用它作为 click: $parent.switch 这很奇怪。
    • for: 是另一个吸引我的属性,需要 'for': 才能在 IE
    • 这应该是这个问题的公认答案。简单直接。是的,我们都讨厌 IE8。
    【解决方案2】:

    您是否有理由远离淘汰赛的“css”绑定

    http://knockoutjs.com/documentation/css-binding.html

    很高兴知道您在 IE 中发现了问题,并且您找到了解决方法, 但由于它不在“attr”绑定的文档中, 而“css”绑定似乎是淘汰赛的推荐课程 应用类名的动作,可能不会令人困惑 为您或未来的其他人?

    来自knockout documentation for "css" binding

    "目的

    css 绑定向关联的 DOM 元素添加或删除一个或多个命名的 CSS 类 [强调]。这很有用,例如,如果某个值变为负数,则用红色突出显示它。

    (注意:如果您不想应用 CSS 类而是想直接分配样式属性值,请参阅样式绑定。)"

    【讨论】:

    • 这里是 attr 绑定的docs。 CSS 绑定用于设置 CSS 属性,例如边距或填充。我试图设置类 attribute
    • @AdamRackis - 我在文档中没有看到 css 绑定用于设置单个样式属性。相反,我在答案中添加的部分 css 绑定文档显示它适用于 css 类。此外,如果您想直接添加特定的 css 属性,css 文档会说“分配样式属性”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    相关资源
    最近更新 更多