javascript - 如何在数据绑定(bind) View 中模板化 If-Else 结构?

标签 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 -->

是否有更好/更简洁的方法来在 KO 中执行条件语句,或者是否有比仅使用传统的 if-else 结构更好的方法

此外,我只想指出某些版本的 Internet Explorer (IE 8/9) 无法正确解析上述示例。请看this SO question了解更多信息。快速总结是,不要在表格标签内使用注释(虚拟绑定(bind))来支持 IE。使用 tbody 代替:

<tbody data-bind="if: display"><tr><td>hello</td></tr></tbody>

最佳答案

有几种不同的方法可以处理这种类型的代码。

  • 像您现在这样使用 if/ifnot 组合。这工作正常并且不是非常冗长。

  • Michael Best 的 switch/case 绑定(bind) ( https://github.com/mbest/knockout-switch-case ) 非常灵活,可以让您轻松处理这种情况和更复杂的情况(状态多于 true/false)。

  • 另一种选择是使用动态模板。您可以将一个区域绑定(bind)到一个或多个模板,并根据可观察对象使用模板名称。这是我不久前就此主题写的一篇文章:http://www.knockmeout.net/2011/03/quick-tip-dynamically-changing.html .在您的场景中,它可能看起来像:

<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>

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

关于javascript - 如何在数据绑定(bind) View 中模板化 If-Else 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11553999/

相关文章:

css - Knockout Js 未在最新版本的 Edge 上更新

css - 将 bool 值绑定(bind)到类

javascript - 将鼠标悬停在 prepend() 函数中

Javascript - 将 javascript 对象数组转换为排序的键/值 javascript 对象

javascript - 如何在 puppeteer 的评估函数中评估通过父页面的 url 检索到的页面

javascript - Knockout.js 在 foreach 绑定(bind)中绑定(bind)选择选项和值

javascript - KnockoutJS 和计算属性不起作用

javascript - 每日倒计时器 - 在 21 :57 显示消息

javascript - 如何将错误从 $.ajax 实例冒泡到 $.ajaxSetup?

javascript - knockout 绑定(bind)继承的 javascript 对象