【问题标题】:Shuffle only fetched items in Backbone Collection仅在 Backbone Collection 中随机播放获取的项目
【发布时间】:2013-10-30 19:01:43
【问题描述】:

The Backbone.Collection object proxies Underscore's Collection.shuffle() 所以所有 Backbone 集合都有方法 shuffle()

Underscore 的 shuffle 工作正常:

如果我只想随机播放下划线集合中的最后 5 个项目,可以使用 slice()

您还可以对 Backbone 集合进行切片和洗牌:

但是对于从数据库中多次获取 fetches 项目的主干集合,我似乎无法仅对最后一次 fetch 调用获取的项目进行洗牌,因为集合中的项目似乎是按获取它们的顺序,即使在切片洗牌之后也是如此。

a.models  // say, [id:1, id:2, id:3]
a.fetch().done(function (data) {
    return data = _.shuffle(data)
})
a.models  // [id:1, id:2, id:3, id:4, id:5, id:6], still sorted

似乎在延迟对象内部进行排序不会以任何方式改变外部集合。

那么,我如何才能仅对 Backbone 集合末尾的 n 项进行排序?

【问题讨论】:

  • 在 fetch 的成功回调中打乱数据怎么样?
  • 所以你想随机或排序?
  • @Jack 你是说示例中的.fetch().done 回调吗?
  • @Brian 我看到你解决了你的问题,我的意思是向fetch 调用传递一个成功回调,类似于.fetch({ success: function (collection, response, options) {...

标签: backbone.js


【解决方案1】:

您可以使用 parse 函数来打乱从服务器返回的数据:

MyCollection.prototype.parse = function(resp){
  return _.shuffle(resp);
};

myCollection.fetch();

【讨论】:

  • 哦,我没有想到解析级别的洗牌。这看起来很有希望......现在将对其进行测试。
  • 这出乎意料的天才。谢谢工具包!
【解决方案2】:

您可以使用随机比较器在项目添加到集合时对其进行随机播放。

comparator: function(a) {
  var rand = _.random(0, 1000);
  a.set({rand: rand});
  return rand;
}

小提琴:http://jsfiddle.net/pYyRp/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    相关资源
    最近更新 更多