排序Breeze导航属性

时间:2013-04-23 23:02:23

标签: knockout.js breeze

如何在微风实体中对一组实体进行排序?例如,如果我有一个包含许多项目的订单,我该如何按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 强文

1 个答案:

答案 0 :(得分:3)

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

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

足够的理论。你有工作要做。我该怎么办?两件事之一

1)使用OrderViewModel

“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方法。

这是我能带你去的地方。

2)使用Order.sortableItems

扩展Order实体

也许你决定不再是这样的纯粹主义者。您愿意修改模型实体以使其与您的UI很好地配合。所以你添加我刚刚描述的KO-Sortable属性......但是将它添加到Order实体in a Custom Initializer而不是OrderViewModel。

这可能会简化您的工作。另一方面,您(a)污染了具有UI关注点的Order实体,并且(b)将自己局限于适用于引用给定订单的所有视图的单一类型的项目。 (a)你可以说“谁在乎?”(我一直这样做)。但是(b)可能是个问题......在这种情况下,你会回到OrderViewModel以获得最大的灵活性。