【问题标题】:KnockoutJS is only showing my template if I have an extra li如果我有额外的 li,KnockoutJS 只会显示我的模板
【发布时间】:2012-05-23 02:37:26
【问题描述】:

所以我有一个模板,用于对一些可能有子元素的对象进行递归。我已经让 if 语句按照我想要的方式工作(我认为)。但是,只有在 if 语句之前有一个额外的 li 时,我的子元素才会出现。

这是我的模板

<script type="text/html" id="journalTemplate">
<li data-bind="text: Description">
    <div>
    <li data-bind = "visible: IsGroup"></li>
    <!-- ko if: IsGroup -->
    <ol data-bind="template: {name: 'journalTemplate', foreach: ChildEntities}">
    </ol>
    <!-- /ko -->
    </div>
</li>

我正在使用数组映射,因此没有要显示的真实视图模型,但 C# 对象非常简单:它有一个描述、一个布尔 IsGroup 和一个 ChildEntities 列表(如果 IsGroup 为 false,则为 null,作为旁注)。如果我没有空的 li,if 语句的注释块甚至不会出现。

有什么想法吗?

【问题讨论】:

  • 我不太关注。上面的模板有效吗?或者您在 KO if 语句之前需要另一个 LI 元素才能使其工作?目前您的上述标记无效。 div 中不能有 LI 元素。
  • 你能添加一个你的问题的jsfiddle吗?
  • @madcapnmckay:现在它可以工作,但是当我实际上不想要那个 li 时,它有那个
  • 。我只想要带有文本的 li 和 sub ol。 (我已经删除了 div,我只是补充说希望它能解决我的问题,但它没有)。我不确定如何放置 jsfiddle,因为我正在从数据库中的实际数据填充我的 js 对象。不过,我会开始模拟一些东西。
  • Here's 一个 js 小提琴。它在小提琴中看起来是正确的,因为它没有显示空的 li。不过,我不希望空的 li 在那里。但是,如果没有空的 li,它就不能在子项上正确运行模板。
  • 标签: knockout.js


    【解决方案1】:

    好的,我看到了问题。问题是您的 LI 上的文本绑定。

    html 中的文本由 textNode dom 元素表示,尽管它们不能在 html 标记中显式编写,但它们的行为方式相同。实际上,您的文本绑定正在用它拥有的任何文本替换 LI 的 innerHtml。

    我不太清楚的是为什么您额外的无效 LI 元素会停止对 innerHtml 的完全替换...

    无论如何,正确的解决方案是像这样构建您的模板。

    <script type="text/html" id="journalTemplate">
        <li>
            <span data-bind="text: Description"></span>
            <!-- ko if: IsGroup -->
            <ol data-bind="template: {name: 'journalTemplate', 
                      foreach: ChildEntities}">
            </ol>
            <!-- /ko -->
        </li>
    </script>
    

    http://jsfiddle.net/madcapnmckay/F2vSW/1/

    希望这会有所帮助。

    【讨论】:

    • 我在你发帖之前就知道了。不过,不知道为什么额外的 li 事情解决了它。无论如何,谢谢!
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签