如何在微风实体中对一组实体进行排序?例如,如果我有一个包含许多项目的订单,我该如何按orderDate对项目进行排序?
<div databind="ko with: order">
<ol databind="foreach: items">
<li/>
</ol>
</div>
另外,我不能在data-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 强文
答案 0 :(得分:3)
我认为简短的回答是“你做不到”。 Breeze实体属性是简单的,无序的ObservableArrays,因为它们是模型的一部分。
您想要实现的是UI效果......严格来说,它不属于模型。该模型应该是UI独立的。如果订单数据存储在SQL数据库中,则订单项的顺序在那里严格定义。
足够的理论。你有工作要做。我该怎么办?两件事之一
“OrderViewModel”是一个“ItemViewModel”,它是一个模型对象的包装器,它具有支持视图的“特殊能力”。 OrderViewModel可以公开其包装的Order对象以绑定其大多数属性。但是当你需要一些特殊的东西时...比如你的排序“项目”...你在OrderViewModel 上创建一个KO属性用于显示目的......称之为“sortableItems”并绑定到THAT in你的看法。
这是一个简单的伪代码实现:
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
方法。
这是我能带你去的地方。
也许你决定不再是这样的纯粹主义者。您愿意修改模型实体以使其与您的UI很好地配合。所以你添加我刚刚描述的KO-Sortable属性......但是将它添加到Order
实体in a Custom Initializer而不是OrderViewModel。
这可能会简化您的工作。另一方面,您(a)污染了具有UI关注点的Order实体,并且(b)将自己局限于适用于引用给定订单的所有视图的单一类型的项目。 (a)你可以说“谁在乎?”(我一直这样做)。但是(b)可能是个问题......在这种情况下,你会回到OrderViewModel以获得最大的灵活性。