按名称和类别Backbone Collection排序

时间:2012-05-12 12:50:24

标签: backbone.js

我有一个骨干系列和两个按钮。我想要做的是,如果我点击button1它应该按名称排序集合,如果点击button2它应按类别排序。

我试过这个

comparator : function(model){
     return model.get("Name");
}

我的问题是我的收藏中可以有两个比较器吗?我将如何分别按名称和类别对集合进行排序。有任何想法吗?感谢

2 个答案:

答案 0 :(得分:7)

您可以将一个排序变量附加到集合中,并在比较器中使用它:

    App.List = Backbone.Collection.extend({
      initialize: function() {
        this.sortVar = 'Name';
      },
      comparator: function(model){
        return model.get(this.sortVar);
      }
    })

然后在单击链接时更改sortVar并调用sort()。

答案 1 :(得分:0)

另一种方法是使用 sortBy 方法(它来自下划线,但它可用于Backbone.Collection):使用该方法,您只需传入模型属性名称。请注意,sortBy方法返回一个数组。

这里我有一个独立的按钮视图。触发排序事件使其他视图(例如,处理列表呈现的视图)能够响应排序事件并重新呈现自己。

app.ButtonsView = Backbone.View.extend({

        el: '#buttons',

        events: {
            'click #sortByNameBtn' : 'sortByName',
            'click #sortByCategoryBtn' : 'sortByCategory'
        },

        sortByName : function(){
            app.mycollection.models = app.mycollection.sortBy('name');  
            app.mycollection.trigger('sort');                                                       
        }, 

        sortByCategory : function(){                    
            app.mycollection.models = app.mycollection.sortBy('category');  
            app.mycollection.trigger('sort');                                                                       
        }
    });

参考:http://backbonejs.org/docs/backbone.html(搜索sortBy)

使用sortBy 不会触发'sort'事件,这就是我自己在集合中触发它的原因。 此外,sortBy可能不适用于Date属性或其他复杂的排序,因此请使用比较器。