【问题标题】:Reset "insertion sort order" for backbone collection重置骨干集合的“插入排序顺序”
【发布时间】:2013-04-02 00:31:18
【问题描述】:

我在运行时在我的主干集合上设置和取消设置比较器函数,我想知道是否有办法将集合“重置”为其原始插入顺序。比如……

var Mod = Backbone.Model.extend({});
var Col = Backbone.Collection.extend({ model: Mod });
var col = new Col([
    { name: "andy" },
    { name: "chad" },
    { name: "ashley" },
    { name: "louis" }
]);

col.comparator = function(p1, p2) {
    return p1.get('name') < p2.get('name') ? -1
        : (p1.get('name') > p2.get('name') ? 1 : 0 );
}
col.sort();

col.comparator = false;

// throws, was hoping this would return 
// the collection to insertion order
col.sort();

请忽略我在此处设置的比较器功能可以替换为sortBy 实现的事实。这只是一个人为的例子。从 Backbone 源代码中我很清楚,如果您尝试对没有比较器的集合进行排序,它将抛出:

// ... from BB source ...
sort: function(options) {
    if (!this.comparator) throw new Error('Cannot sort a set without a comparator');
    // ...

有没有办法将集合的顺序返回到插入顺序?

【问题讨论】:

  • 原始顺序是任意的吗?如果是这样,如果不重新获取或手动重置集合,将很难将其取回。如果原始订单按 id 或其他值排序,您将能够使用不同的比较器功能。数据是否来自服务器?我怀疑服务器是否返回任意顺序,所以它可能是按 id 或自动增量值或日期排序的,你可以尝试在这里按相同的东西排序。
  • 我想要的订单只是插入订单。我相信@Loamhoof 是正确的,因为我需要在整个系列的整个生命周期中跟踪这个订单
  • 嗯,在排序之前,您可以为每个模型添加一个新属性model.set({originalOrder: num++}),然后稍后根据此排序...但是,如果集合是任意顺序的,@Loamhoof 是正确的。

标签: javascript backbone.js


【解决方案1】:

不,没有。尽管您可以轻松地保留一些数组来保留此信息以供以后使用。重新定义 add 方法,“破解”解析方法...
但是,是的,可悲的是,拥有一个没有任何意义。

【讨论】:

    【解决方案2】:

    您可以将原件保存在收藏夹中。比如:

    col.originalComp = col.comparator;
    col.comparator = function(){};
    ...Do Stuff ...
    col.comparator = col.originalComp; //Back to original
    

    【讨论】:

    • 嗯,没有默认的,所以没什么用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    相关资源
    最近更新 更多