Как сортировать коллекции в backboneJs

я изучаю BackboneJs, используя документацию и книгу под названием «Beginning backbone». Но я часами застрял в части сортировки коллекций. Также пытался исследовать, но я нахожу результаты сложными =/

Я знаю, что мне нужно использовать компаратор, как показано в документации, но я не понимаю, как применить его к текущему синтаксису кода.

http://backbonejs.org/#Collection-comparator

var Book = Backbone.Model.extend({
    defaults:
    {
        title: "default title",
        author: "default author",
        pages: 20
    },
    comparator: function(item)
    {
        //sort by title
        return item.get('title');   
    }
});

var book1 = new Book({ title:"Book of wonders",author:"author1",pages:1 });
var book2 = new Book({ title:"Zelda",author:"author2",pages:2 });
var book3 = new Book({ title: "Drake's out", author: "author3",pages:3});
var book4 = new Book({ title: "AutoCad",author: "author4",pages: 4});

var Library = Backbone.Collection.extend({
    model: Book
});

var library = new Library([book1,book2]);
library.add([book3,book4]); 

library.forEach(function(model){
    console.log('Book is called '+model.get("title"));
});

console.log('Library contains '+library.length+' books');

person user254883    schedule 25.03.2014    source источник


Ответы (1)


Это рабочее решение, оно будет сортировать все по названию. чтобы отсортировать его по чему-либо еще, просто измените параметр функции get внутри функции компаратора

    var Book = Backbone.Model.extend({
        defaults:
        {
            title: "default title",
            author: "default author",
            pages: 20
        } 
    });

    var book1 = new Book({ title:"Book of wonders",author:"author1",pages:1 });
    var book2 = new Book({ title:"Zelda",author:"author2",pages:2 });
    var book3 = new Book({ title: "Drake's out", author: "author3",pages:3});
    var book4 = new Book({ title: "AutoCad",author: "author4",pages: 4});

    var Library = Backbone.Collection.extend({
        model: Book,
        initialize: function()
        {
            console.log("new collection");
        },
        comparator: function(a,b)
        {
            //sort by title
            return a.get('title') < b.get('title') ? -1 : 1;
        }
    });

    var library = new Library([book1,book2]);
    library.add([book3,book4]); 

    library.sort(); 
    library.forEach(function(model){
        console.log('Book is called '+model.get("title"));
    });

    console.log('Library contains '+library.length+' books');   
person user254883    schedule 25.03.2014
comment
Вы пропустили случай a.get('title') == b.get('title'), ваш comparator должен возвращать ноль в таких случаях, поскольку в конечном итоге он использует стандартный Array.prototype.sort. - person mu is too short; 25.03.2014
comment
я должен поставить его в первой строке компаратора? - person user254883; 26.03.2014
comment
Вам просто нужно охватить три случая: a_title == b_title, a_title < b_title, a_title > b_title; они должны возвращать 0, -1 и 1 (соответственно). Выставляйте условия как хотите. - person mu is too short; 26.03.2014