Возможно ли динамически определять функцию сравнения для коллекции?

#backbone.js

#backbone.js

Вопрос:

У меня есть базовая коллекция :

 myCollection = Backbone.Collection.extend({
  model: myModel
  url: '/theurl',
  initialize: function(){
    this.fetch();
  })
})
  

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

В представлении, связанном с коллекцией, я попытался привязать событие click к обратному вызову следующим образом :

 reorderByName: function(){
  myCollection.comparator = function(item){
    return item.get('name');
  });
  this.render();
})
  

К сожалению, это, похоже, не работает. Есть предложения относительно того, как я мог бы это сделать?

Спасибо.

Ответ №1:

Похоже, вы сделали только половину того, что вам нужно сделать. Вы предоставили коллекции ее компаратор, но не сказали ей прибегать к нему самой. Итак, вам нужно добавить что-то вроде этого оператора прямо перед рендерингом:

 myCollection.sort();
  

Обратите внимание, что это вызовет reset событие, которое будет получено любым объектом, к которому вы привязали это событие. Если вы хотите запретить запуск этого события, вы могли бы выполнить вызов таким образом:

 myCollection.sort({silent: true});
  

Надеюсь, это поможет.

Комментарии:

1. Да, по какой-то причине я пропустил «сортировку» в документах … Спасибо за помощь

Ответ №2:

Я нашел это, когда искал решение своих собственных проблем с comparator. Я подумал, что хотел бы добавить, на случай, если кто-нибудь еще обнаружит этот вопрос, что если модели в ваших коллекциях имеют неопределенные значения для свойства, по которому сортирует ваш компаратор, сортировка не произойдет. Обязательно используйте значения по умолчанию в вашей модели, если они не требуются, и вы собираетесь сортировать по ним. 😉