如何在 Breeze 实体中对一组实体进行排序?例如,如果我有一个包含许多商品的订单,如何按 orderDate 对商品进行排序?
<div databind="ko with: order">
<ol databind="foreach: items">
<li/>
</ol>
</div>
此外,我无法在数据绑定(bind)中使用 items.sort(),因为我正在使列表项可排序。 https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CDYQFjAA&url=https%3A%2F%2Fgithub.com%2Frniemeyer%2Fknockout-sortable&ei=8BJ3UaXZMMGG2wW5yoGQCw&usg=AFQjCNFnjZ_6ths9dl_UW9BpJkFO3Yi6kA&sig2=swWZW7Rq6IqAcIX2-2Cl6w&bvm=bv.45580626,d.b2I 强文字
最佳答案
我认为简短的答案是“你不能”。 Breeze 实体属性是简单的、无序的 ObservableArrays,因为它们是模型的一部分。
你想要实现的是UI效果……严格来说,它不属于模型。该模型应该是独立于 UI 的。如果订单数据存储在 SQL 数据库中,则订单项目的顺序在其中严格未定义。
足够的理论了。你有工作要做。我可以做什么?两件事之一
1) 使用 OrderViewModel
“OrderViewModel”是一个“ItemViewModel”,它是模型对象的包装器,具有支持 View 的“特殊能力”。 OrderViewModel 可以公开其包装的 Order 对象以绑定(bind)其大部分属性。但是,当您需要一些特殊的东西时...例如排序的“items”...您在 OrderViewModel 上创建一个 KO 属性用于显示目的...将其称为“sortableItems”并绑定(bind)到该属性你的观点。
这是一个简单的伪代码实现:
app.OrderViewModel = function(order) { this.order = order; this.sortableItems = ko.observableArray(); this.resetSortableItems(); } app.OrderViewModel.prototype.resetSortableItems() { // (re)initialize with copy of the items this.sortableItems(this.order.items().slice(0)); // maybe some ordering logic here? }
您的“sortableItems”以您想要的方式覆盖内部Order.items
;它将是可排序的,也许可以通过您提到的 KO-Sortable 功能进行排序。
困难的部分(未显示)是在添加或删除商品时使其与内部 Order.items
属性保持同步。请记住,内部 Order.items
属性是事实的真正来源。也许你很幸运并且完全掌握了任何可以添加/删除项目的内容;那么当这些更改发生时,您只需调用 resetSortableItems
方法即可。
这是我能带你到的最大程度了。
2) 使用 Order.sortableItems 扩展 Order 实体
也许您已经决定不再成为一个纯粹主义者。您愿意修改模型实体以使其与您的 UI 配合良好。因此,您添加我刚才描述的 KO-Sortable 属性...但将其添加到 Order
实体 in a Custom Initializer而不是 OrderViewModel。
这可能会简化您的事情。另一方面,您 (a) 由于 UI 问题而污染了 Order 实体,并且 (b) 将自己限制为单一类别的项目,该类别适用于引用给定订单的所有 View 。对于 (a),您可能会说“谁在乎?”(我一直这样做)。但是 (b) 可能是一个问题......在这种情况下,您可以返回到 OrderViewModel 以获得最大的灵活性。
关于knockout.js - 对 Breeze 导航属性进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16180592/