Proper way to sort a backbone.js collection on the fly

前端 未结 6 1008
孤独总比滥情好
孤独总比滥情好 2021-01-30 02:31

I can successfully do this:

App.SomeCollection = Backbone.Collection.extend({
  comparator: function( collection ){
    return( collection.get( \'lastName\' ) );         


        
6条回答
  •  清酒与你
    2021-01-30 02:57

    Interesting question. I would try a variant on the strategy pattern here. You could create a hash of sorting functions, then set comparator based on the selected member of the hash:

    App.SomeCollection = Backbone.Collection.extend({
        comparator: strategies[selectedStrategy],
        strategies: {
            firstName: function () { /* first name sorting implementation here */ }, 
            lastName: function () { /* last name sorting implementation here */ },
        },
        selectedStrategy: "firstName"
    });
    

    Then you could change your sorting strategy on the fly by updating the value of the selectedStrategy property.

    EDIT: I realized after I went to bed :) that this wouldn't quite work as I wrote it above, because we're passing an object literal to Collection.extend. The comparator property will be evaluated once, when the object is created, so it won't change on the fly unless forced to do so. There is probably a cleaner way to do this, but this demonstrates switching the comparator functions on the fly:

    var SomeCollection = Backbone.Collection.extend({
        comparator: function (property) {
            return selectedStrategy.apply(myModel.get(property));
        },
        strategies: {
            firstName: function (person) { return person.get("firstName"); }, 
            lastName: function (person) { return person.get("lastName"); },
        },
        changeSort: function (sortProperty) {
            this.comparator = this.strategies[sortProperty];
        },
        initialize: function () {
            this.changeSort("lastName");
            console.log(this.comparator);
            this.changeSort("firstName");
            console.log(this.comparator);        
        }                                                                                        
    });
    
    var myCollection = new SomeCollection;
    

    Here's a jsFiddle that demonstrates this.

    The root of all of your problems, I think, is that properties on JavaScript object literals are evaluated immediately when the object is created, so you have to overwrite the property if you want to change it. If you try to write some kind of switching into the property itself it'll get set to an initial value and stay there.

    Here's a good blog post that discusses this in a slightly different context.

提交回复
热议问题