Backbone.js对过滤后的集合进行排序?

时间:2014-06-05 16:06:35

标签: sorting backbone.js backbone-views backbone-events backbone-collections

我是骨干新手,这是我第一次尝试对系列进行排序和过滤,非常感谢任何帮助。我有一个Backbone View,它显示了一个模型集合,这些模型在加载时使用集合比较器以反向日期顺序排序。此集合具有允许通过将比较器设置为不同的值(公司)并在集合上调用sort方法来更改排序的方法。

该集合还有一个过滤集合并返回新过滤集合的方法。我遇到的问题是我不能在新过滤的集合上使用排序方法。

收藏

var Tickets = Backbone.Collection.extend({
model: TicketModel,
url: '/tickets',

comparator: function(a,b) {
    if(a.get('date') < b.get('date')) {
        return 1;   
    } else if(b.get('date') > a.get('date')){
        return -1;
    }
    return 0;
},

byFilter: function(key, value){
    filtered = this.filter(function(data){
        return data.get(key) === value;
    });
    return new Tickets(filtered);
},

byDate: function() {
    this.comparator = function(a, b) {
        if(a.get('date') < b.get('date')) {
            return 1;   
        } else if(b.get('date') > a.get('date')){
            return -1;
        }
        return 0;
    };
    this.sort();
},

byCompany: function(){
    this.comparator = function(model) {
        return model.get('company');
    }
    this.sort();
}

});

视图

var TicketView = Backbone.View.extend({
template: Handlebars.compile(
    '<div class="sort">' +
        '<a class="sortByDate">Sort By Date</a>' +
        '<a class="sortByCompany">Sort By Company</a>' +
    '</div>' +
    '<div class="filter">' +
        '<a class="allTickets">All Tickets</a>' +
        '<a class="myTickets mid-link">My Tickets</a>' +
        '<a class="completedTickets">Completed Tickets</a>' +
    '</div>' +
    '<ul>'+
    '{{#each models}}<li class="ticket">' +                 
    '<div class="date">{{attributes.date}}</div>' +
    '<div class="name">{{attributes.name}}</div>' +
    '<div class="company-name">{{attributes.company}}</div>' +
    '</li>{{/each}}'+
    '</ul>'     
),

initialize: function() {
    this.listenTo(this.collection, "reset", this.render);
    this.listenTo(this.collection, "add", this.render);
    this.listenTo(this.collection, "remove", this.render);
    this.listenTo(this.collection, "change", this.render);

    this.listenTo(this.collection, "sort", this.render);
},

render: function() {
    this.$el.html(this.template(this.collection));
    this.delegateEvents({
        'click .sortByDate': 'sortByDate',
        'click .sortByCompany': 'sortByCompany',
        'click .myTickets': 'myTickets',
        'click .completedTickets': 'completedTickets',
        'click .allTickets': 'allTickets'
    });
    return this;
},

sortByDate: function(){
    this.collection.byDate();
},

sortByCompany: function(){
    this.collection.byCompany();
},

myTickets: function() {
    this.$el.html(this.template(this.collection.byFilter("user", "Edd N.")));
},

completedTickets: function() {      
    this.$el.html(this.template(this.collection.byFilter("status", "Completed")));
},

allTickets: function(){
    this.$el.html(this.template(this.collection));
}

});

我相信代码不允许对过滤后的集合进行排序,因为这些方法归因于原始集合,而过滤后的集合是&#34; Tickets&#34;的新实例化。并且不能使用这些方法,可能是因为它没有正确的事件监听器。

我已经多次尝试通过引用原始集合并为过滤的票证创建单独的集合,然后尝试在新集合上调用排序方法但没有成功来实现所需的排序。我还尝试创建另一个视图,并将过滤后的集合传递到该视图中,事件监听器在过滤集合上查找事件。

上面的代码已从我的所有尝试中删除,但我希望它能够展示我想要实现的目标,并且感谢您对此提供任何帮助。

提前致谢,Edd Neal。

0 个答案:

没有答案