如何模拟数据绑定视图中的If-Else结构?

Jen*_*ing 94 javascript knockout.js

我总是发现自己在基于KO的HTML模板中使用这个习惯用法:

<!-- ko if: isEdit -->
<td><input type="text" name="email" data-bind="value: email" /></td>
<!-- /ko -->
<!-- ko ifnot: isEdit -->
<td data-bind="text: email"></td>
<!-- /ko -->
Run Code Online (Sandbox Code Playgroud)

是否有一种更好/更清洁的方法来在KO中进行条件化,还是有一种更好的方法而不仅仅是使用传统的if-else结构?

另外,我想指出一些版本的Internet Explorer(IE 8/9)没有正确解析上面的例子.有关更多信息,请参阅此SO问题.快速摘要是,不要在表标记内使用注释(虚拟绑定)来支持IE.使用tbody代替:

<tbody data-bind="if: display"><tr><td>hello</td></tr></tbody>
Run Code Online (Sandbox Code Playgroud)

RP *_*yer 63

您可以通过几种不同的方式处理此类代码.

<td data-bind="template: $root.getCellTemplate"></td>

<script id="cellEditTmpl" type="text/html">
    <input type="text" name="email" data-bind="value: email" />
</script>

<script id="cellTmpl" type="text/html">
    <span data-bind="text: email"></span>
</script>
Run Code Online (Sandbox Code Playgroud)

getCellTemplate函数可以存在于任何地方,但会将项目($ data)作为第一个参数,并返回要使用的模板的名称.


Mic*_*est 44

一种方法是使用命名模板(可以支持传递参数):

<!-- ko template: isEdit() ? 'emailEdit' : 'emailDisplay' --><!-- /ko -->
<script id="emailEdit" type="text/html">
    <td><input type="text" name="email" data-bind="value: email" /></td>
</script>
<script id="emailDisplay" type="text/html">
    <td data-bind="text: email"></td>
</script>
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用我的switch/case插件,它的工作原理如下:

<!-- ko switch -->
    <!-- ko case: isEdit -->
        <td><input type="text" name="email" data-bind="value: email" /></td>
    <!-- /ko -->
    <!-- ko case: $else -->
        <td data-bind="text: email"></td>
    <!-- /ko -->
<!-- /ko -->
Run Code Online (Sandbox Code Playgroud)

  • 你到那里的好插件!肯定会使用这个. (2认同)