Подтвердить что ты не робот

Сортировка коллекции базовых групп После инициализации

Я использую Backbone.js для отображения списка элементов, например, книг. После отображения списка есть опции для сортировки пользователей. Поэтому, если пользователь нажимает кнопку "Сортировать по названию" или "Сортировать по имени автора", список будет сортироваться на стороне клиента.

  window.Book = Backbone.Model.extend({
   defaults: {
     title: "This is the title",
     author: "Name here"
   },

Каков наилучший способ выполнить этот вид, используя в контексте приложения Backbone. Я использую сортировщик jQuery dom в AppView?

4b9b3361

Ответ 1

Там будет обсуждение этой темы, на которую вы можете посмотреть: https://github.com/documentcloud/backbone/issues/41.

Короче говоря, когда пользователь выбирает "sort by X", вы можете:

  • Задайте функцию comparator в коллекции
  • Вызвать функцию Collection sort (которая вызовет событие sort)
  • Слушайте событие sort в вашем представлении и (очистите и) перерисуйте элементы

Другой способ обработки шагов 1 и 2 состоит в том, чтобы иметь собственный метод, который вызывает метод Collection sortBy, а затем запускает настраиваемое событие, которое может просматривать ваш просмотр.

Но похоже, что очистка и перерисовка - это самый простой (и, возможно, самый быстрый) способ сортировки вашего представления и синхронизация с порядком сортировки коллекции.

Ответ 2

Вы можете обновить функцию компаратора, а затем вызвать метод сортировки.

// update comparator function
collection.comparator = function(model) {
    return model.get('name');
}

// call the sort method
collection.sort();

Вид будет автоматически перерисовываться.

Ответ 3

comparator - это то, что вам нужно

var PhotoCollection = Backbone.Collection.extend({
    model: Photo,
    comparator: function(item) {
        return item.get('pid');
    }
});

Ответ 4

Этот способ работает хорошо и позволяет динамически сортировать по всем attributes и обрабатывать ascending или descending:

var PhotoCollection = Backbone.Collection.extend({
    model: Photo,
    sortByField: function(field, direction){
            sorted = _.sortBy(this.models, function(model){
                return model.get(field);
            });

            if(direction === 'descending'){
                sorted = sorted.reverse()
            }

            this.models = sorted;
    }
});