【发布时间】:2015-08-11 20:51:01
【问题描述】:
我有一个可观察的项目数组,这些项目使用 Knockout 可排序插件可拖放/可拖放。我可以根据doc 使用以下代码在元素上应用自定义模板绑定。
<div style="border-width:0;" data-bind="sortable: {template: 'customTemplate', data: observableArray}">
我的要求是根据应用于项目属性的特定条件为数组中的不同项目使用不同的模板。例如,如果我们对可观察数组中的每个项目都有一个名为“status”的属性,如果状态为真,我想绑定“template1”,否则为“template2”。
对于可以在 ko 中使用 foreach 循环遍历的数组,我可以实现相同的效果,但对于可排序数组,我无法做到这一点,因为它不允许使用 foreach。有人可以提出相同的解决方案/解决方法吗?
更新:我能够根据条件在同一个模板中应用自定义绑定,但这会导致一个奇怪的错误,即元素在将其拖放到目标容器中时被克隆到父容器中。 Demo可以看这里:jsFiddle
我根据姓名对学生应用了不同的样式,但是在将学生放到表中时,它也会被克隆到父表中。可能是什么问题?
注意:我不想将条件 css 绑定到我的元素,我想根据条件区分元素呈现的方式。示例 - 以座位示例为例,如果我有学生对象的属性名称、年龄和班级,我只想显示少数学生的姓名,而某些学生的所有 3 个属性可以在示例小提琴中看到。
【问题讨论】:
-
如果您需要使用两个模板,您可以在单独的模板代码
<!-- ko if:status --> //code <!--/ko-->和<!-- ko if:! status() --> //code <!--/ko-->上尝试此操作。欢呼 -
类似 jsfiddle.net/supercool/jyFTX/5 的东西。欢呼
-
感谢您的回复@supercool。甚至我之前也尝试通过在同一个模板中应用条件 HTML 来做同样的事情。它工作得很好,但奇怪的是,当我将元素拖放到容器中时,它也会在父容器中创建一个副本,而不是简单地将项目移动到目标容器。
-
哦,我知道你能做一个小提琴来重现你的问题。所以很容易弄清楚为什么。
-
嗨@supercool,用小提琴编辑了答案。
标签: jquery-ui knockout.js knockout-sortable