我认为简短的回答是“你不能”。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.items
resetSortableItems
这是我能带给你的。
2) 使用 Order.sortableItems 扩展 Order 实体
也许你已经决定不做这样一个纯粹主义者。您愿意修改模型实体以使其与您的 UI 配合得很好。因此,您添加了我刚刚描述的 KO-Sortable 属性……但将其添加到自定义初始化Order
程序中的实体,而不是添加到 OrderViewModel。
这可能会为您简化事情。另一方面,您已经 (a) 用 UI 问题污染了 Order 实体,并且 (b) 将自己限制在单一种类的项目上,这些项目将适用于引用给定 Order 的所有视图。对(a)你可以说“谁在乎? ”(我一直这样做)。但是 (b) 可能是一个问题……在这种情况下,您可以返回 OrderViewModel 以获得最大的灵活性。