knockout.js - 对 Breeze 导航属性进行排序

标签 knockout.js breeze

如何在 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/

相关文章:

javascript - Breeze 多对多关系以及在迭代问题上将 Aspect 设置为 'setDeleted'

validation - BreezeJS 不会自动解析使用 KnockoutJS 绑定(bind)保存为字符串的数字

javascript - 如何确定哪个 DOM 元素与 Knockout 可观察数组元素相对应?

knockout.js - 两个选择列表共享相同的值绑定(bind),更新速度慢

javascript - 使用搜索删除 map 图钉

javascript - Breeze - 克隆元素

knockout.js - Breeze 和 Knockout 中的验证

knockout.js - 从observableArray获取具体元素

javascript - 在 Knockouts JS 中对 Observable 数组进行排序

mysql - 使用 restful API 在 nodejs 上实现 breeze