2

如何在微风实体中对一组实体进行排序?例如,如果我有一个包含许多项目的订单,如何按 orderDate 对项目进行排序?

    <div databind="ko with: order">
           <ol databind="foreach: items">
              <li/>
           </ol>
    </div>

此外,我不能在数据绑定中使用 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_6ths39dl6kA&B9 swWZW7Rq6IqAcIX2-2Cl6w&bvm=bv.45580626,d.b2I强文本

4

1 回答 1

3

我认为简短的回答是“你不能”。Breeze 实体属性是简单的、无序的 ObservableArrays,因为它们是模型的一部分。

你想要实现的是一个 UI 效果......严格来说,它不属于模型。该模型应该是独立于 UI 的。如果订单数据存储在 SQL 数据库中,则订单项目的顺序在此处是严格未定义的。

理论够了。你有工作要做。我能做什么?两件事之一

1) 使用 OrderViewModel

“OrderViewModel”是一个“ItemViewModel”,它是一个模型对象的包装器,具有支持视图的“特殊能力”。OrderViewModel 可以公开其包装的 Order 对象以绑定其大部分属性。但是,当您需要一些特殊的东西时……例如排序的“项目”……您在 OrderViewModel 上创建一个 KO 属性以用于显示目的……将其称为“sortableItems”并在您的视图中绑定到 THAT。

这是一个简单的伪代码实现:

app.OrderViewModel = 功能(订单){
   this.order = 订单;
   this.sortableItems = ko.observableArray();

   this.resetSortableItems();
}

app.OrderViewModel.prototype.resetSortableItems() {
    //(重新)使用项目的副本初始化
    this.sortableItems(this.order.items().slice(0));
    // 也许这里有一些排序逻辑?
}

Order.items您的“sortableItems”以您想要的方式覆盖内部;它可能是可排序的,也许是通过您提到的 KO-Sortable 功能。

困难的部分(未显示)是在添加或删除项目时Order.items使其与内部属性保持同步。记住内在属性是真理的真正来源。也许你很幸运,并且完全掌握了可以添加/删除项目的任何东西;那么您可以在发生这些更改时调用该方法。Order.itemsresetSortableItems

这是我能带给你的。

2) 使用 Order.sortableItems 扩展 Order 实体

也许你已经决定不做这样一个纯粹主义者。您愿意修改模型实体以使其与您的 UI 配合得很好。因此,您添加了我刚刚描述的 KO-Sortable 属性……但将其添加到自定义初始化Order程序中的实体,而不是添加到 OrderViewModel。

这可能会为您简化事情。另一方面,您已经 (a) 用 UI 问题污染了 Order 实体,并且 (b) 将自己限制在单一种类的项目上,这些项目将适用于引用给定 Order 的所有视图。对(a)你可以说“谁在乎? ”(我一直这样做)。但是 (b) 可能是一个问题……在这种情况下,您可以返回 OrderViewModel 以获得最大的灵活性。

于 2013-04-27T02:43:44.317 回答