2014-02-13 56 views
2

我想按照字母顺序在Backbone.js使用Coffeescript排序集合。该集合是我想要显示的表格中的前5个对象。Backbone.js比较不排序(Coffeescript)

preview = new Collections.Bananas(@model.get('bananas').slice(0,5)) 

    preview.comparator = (banana) -> banana.get("name") 

    bananas = new BundleOfBananas.Bananas({collection: preview}) 

对象都显示,我得到正确的数据,它只是没有按字母顺序排列。任何人都可以帮助我与Backbone.js比较?谢谢!

回答

3

一个骨干收集各种各样本身时,一两件事情发生:

  1. 你添加一些车型,并有comparator定义。
  2. 您手动拨打集合上的sort,并定义comparator

当你把你的机型:

preview = new Collections.Bananas(@model.get('bananas').slice(0,5)) 

有,据推测,没有comparator上收集所以没有排序进行定义。然后你指定comparator属性:

preview.comparator = (banana) -> banana.get("name") 

,但不叫preview.sort()告诉集合自行解决。

你有两个基本的选择:

  1. 定义比较之前添加任何。您可以使comparator功能集合定义的一部分:

    class Collections.Bananas extends Backbone.Collection 
        comparator: (banana) -> banana.get('name') 
        # as you have now... 
    

    或只使用一个属性,因为你被一个模型属性排序:

    class Collections.Bananas extends Backbone.Collection 
        comparator: 'name' 
        # as you have now... 
    

    然后实例您的收藏:

    new Collections.Bananas(@model.get('bananas')[0..4]) 
    

    这会给你一个自动排序的集合。如果你想手动分配comparator因为你正在做,现在则:

    preview = new Collections.Bananas 
    preview.comparator = 'name' 
    preview.reset(@model.get('bananas')[0..4]) 
    
  2. 手动调用sort

    preview = new Collections.Bananas(@model.get('bananas')[0..4]) 
    preview.comparator = 'name' 
    preview.sort() 
    
+0

这是伟大的,非常感谢!创建定义集合的比较函数效果很好。非常感激! – tommybond

+0

我其实还有另外一个问题。假设我总是希望一个香蕉(主要香蕉,在DB中,它有一个is_primary属性)显示在顶部,而不管它是否按字母顺序排列。这将如何实现? – tommybond

+0

如果你的比较器是'(a,b) - > ...',那么你必须使用两个参数'comparator'函数,那么它的行为就像是一个'Array.prototype.sort'比较函数。 –