Backbone.js集合比较器不按编号排序

时间:2014-02-26 03:50:46

标签: javascript sorting backbone.js underscore.js marionette

我有一个名为users的主干集合,每个user都有一个唯一的name和非唯一的page。我希望按页面对此users集合进行排序,但Backbone的comparator提供与未声明comparator时相同的结果。

假设我有一组像这样的用户(逐个添加,从上到下):

name: B, page: 1
name: D, page: 2
name: A, page: 3
name: C, page: 4

如果我这样做

class Entities.Users extends Backbone.Collection
  ...
  comparator: (u) ->
    u.get("name").toUpperCase()

然后排序符合预期(name):

name: A, page: 3
name: B, page: 1
name: C, page: 4
name: D, page: 2

但是,如果我尝试按page排序:

comparator: (u) ->
  parseInt u.get("page")

然后集合没有正确排序(第1页总是在最后):

name: D, page: 2
name: A, page: 3
name: C, page: 4
name: B, page: 1

为什么会发生这种情况,如何按page正确排序?

修改

这也不适用于page的纯字符串版本:

comparator: (u) ->
  u.get("page")

2 个答案:

答案 0 :(得分:0)

你有没有尝试过这个:

comparator: "page"

答案 1 :(得分:0)

经过多次挖掘后,看起来该集合实际上正在排序,它只是在每个新fetch({remove: false})之后没有进行完全重新渲染。我像这样在CompositeView中添加了一个监听器:

class MyClass extends Marionette.CompositeView
  ...
  initialize: ->
    @collection.on "sync", () => @render()

现在正如预期的那样服从比较器。我仍然不知道为什么在按name排序时也是一个问题。