2014-09-04 4 views
1

У меня есть приложение Backbone.js с плагином для марионетки. Там это коллекция, которая делает с CompositeView (и ItemViews), и мне нужно отсортировать его следующим образом:Backbone.js пользовательская коллекция сортировка

  1. Пользователь может изменить оказанные ItemViews (с помощью JQuery сортируемыми плагин), и этот пользователь предпочтение будет сохранен в куки в форма массива идентификаторов модели
  2. При каждой перезагрузке я хочу сортировать собранную коллекцию в том же порядке, что и вышеупомянутый массив порядка предпочтений пользователей.

Я попытался сортировать массив collection.models вручную в перехвате onRender, а затем перерисовывал его, но этот вид манипуляции с коллекцией просто «чувствует себя не так» (и вызывает бесконечный цикл визуализации).

Есть ли какое-то более элегантное решение для сортировки коллекции, чтобы иметь модели в том же порядке, что и идентификаторы модели, определенные в каком-либо другом массиве?

+0

Посмотрите на http://backbonejs.org/#Collection-comparator – Palpatim

ответ

3

Попробуйте использовать метод Backbone.Collection#comparator, который будет получать доступ к файлу cookie с массивом идентификаторов и использует его для возврата 1 или -1.

функции-компараторы принимают две модели и возвращают -1, если первая модель должна быть до второй, 0, если они имеют одинаковый ранг и 1, если первая модель должна последовать за ней.

var MyCollection = Backbone.Collection.extend({ 

    comparator: function(model_a, model_b) { 
     // In real app array comes from cookie 
     var order = [5, 2, 1, 4, 3], 
      a_index = order.indexOf(model_a.id), 
      b_index = order.indexOf(model_b.id); 

     if (a_index > b_index) { 
      return 1; 
     } else if (a_index < b_index) { 
      return -1; 
     } else { 
      return 0; 
     } 
    } 

}); 

var my_collection = new MyCollection([ 
    { id: 1 }, 
    { id: 2 }, 
    { id: 3 }, 
    { id: 4 }, 
    { id: 5 } 
]); 

alert(my_collection.pluck('id')); 

Вот jsfiddle с этим примером

0

Один из подходов к карте над списком «обычай» ИДС и вернуть модели в коллекции с этим идентификатором:

var items = [ 
    {id: 0, name: '1st', age: 40}, 
    {id: 1, name: '2nd', age: 50}, 
    {id: 2, name: '3rd', age: 60} 
]; 

// order stored in cookie or localstorage ^^ 
var sorted = [2, 1, 0]; 

// our source collection 
var collection = new Backbone.Collection(items); 

// this could be implemented as a collection method if necessary 
var sortedCollection = _.map(sorted, function (id) { 
    return collection.get(id); 
}); 


var sortedIds = sortedCollection.map(function (item) { return item.id }) 
console.log(sortedIds); 
// [2, 1, 0] 

jsbin with an example view