1

无法弄清楚为什么这不起作用?...

<!-- ko if: $root.List().length > 1 || $root.AnyNotEqualToSelectedLanguage() -->
    <div>
         <select data-bind="options: $root.List, optionsText: 'displayText', value: selectedValue, optionsCaption: 'Choose...'"></select>
    </div>
<!-- /ko -->

上面的代码生成一个“找不到要匹配的结束注释标记:ko if: $root.List().length > 1 || $root.AnyNotEqualToSelectedLanguage()”

尽管.......

<!-- ko if: $root.List().length > 1 || $root.AnyNotEqualToSelectedLanguage() -->
    <span>
         <select data-bind="options: $root.List, optionsText: 'displayText', value: selectedValue, optionsCaption: 'Choose...'"></select>
    </span>
<!-- /ko -->

这有效....

有快速了解这个问题的人吗?

4

1 回答 1

4

我可以为第一个代码块不起作用的唯一有效解释是因为您的代码块可能在<p></p>标签内

例如

<p>
<!-- ko if: $root.List().length > 1 || $root.AnyNotEqualToSelectedLanguage() -->
    <div>
         <select data-bind="options: $root.List, optionsText: 'displayText', value: selectedValue, optionsCaption: 'Choose...'"></select>
    </div>
<!-- /ko -->
</p>

由于p不能包含block级别元素,浏览器将p在看到您的div. 该浏览器最终将其视为:

<p>
    <!-- ko if: $root.List().length > 1 || $root.AnyNotEqualToSelectedLanguage() -->
</p>
        <div>
             <select data-bind="options: $root.List, optionsText: 'displayText', value: selectedValue, optionsCaption: 'Choose...'"></select>
        </div>
    <!-- /ko -->
<p></p>

那时,淘汰赛在解析它时遇到了麻烦。

您可以检查为小提琴生成的源代码:http: //jsfiddle.net/jcHzK/1/

它与@Artem 创建的相同小提琴不起作用,因为代码现在位于p标签内。

您的第二个代码有效,因为您已将块元素替换div为内联元素span

一些代码和参数取自https ://github.com/knockout/knockout/issues/346

于 2013-09-18T10:33:47.707 回答