Как я могу отсортировать курсор, используя идентификаторы из другого массива документов?
Я хочу обновить SpaceBars @index
родной помощник, когда я сортирую элементы, отображаемые в #each
итерация. Я думаю, что правильный способ сделать это, чтобы отсортировать курсор, который я использую в #each
,
Курсор происходит от Items
коллекция. Массив, который я использую для их сортировки, принадлежит другому документу коллекции (Projects
), и в нем хранится упорядоченный список каждого опубликованного идентификатора элемента.
После того, как я уронил элемент на новую позицию, я обновляю каждый индекс элемента в массиве документа проекта, используя сортируемую stop
функция. Для этого я $pull
сначала, а потом $push
это в конкретной позиции.
stop: function(e, ui) {
var project = Projects.findOne();
// get the dragged html element and the one before and after it
el = ui.item.get(0)
before = ui.item.prev().get(0)
after = ui.item.next().get(0)
console.log(Blaze.getData(el)._id); //gets the id of the item dropped
if(!before) {
//if it was dragged into the first position
console.log(after.dataset.index); //gets the index of the next element
Projects.update({_id: project._id},
{$pull:
{
items:Blaze.getData(el)._id
}
})
Projects.update({_id: project._id},
{$push:
{
items:
{
$each:[Blaze.getData(el)._id],
$position:0
}
}
})
} else if(!after) {
//if it was dragged into the last position
Projects.update({_id: project._id},
{$pull:
{
items:Blaze.getData(el)._id
}
})
Projects.update({_id: project._id},
{$push:
{
items: Blaze.getData(el)._id
}
})
} else
Projects.update({_id: project._id},
{$pull:
{
items:Blaze.getData(el)._id
}
})
Projects.update({_id: project._id},
{$push:
{
items:
{
$each:[Blaze.getData(el)._id],
$position:after.dataset.index -1
}
}
})
}
Как вы можете видеть, я использую свойство index моего элемента в приведенной выше функции (например, $position:after.dataset.index -1
). Это то, что я хочу обновить, отсортировав мой курсор.
Подводя итог, с одной стороны, у меня есть упорядоченный (с помощью индекса) массив идентификаторов; Пример:
items : {
Id2131,
Id4233,
Id2243,
Id2331,
Id2455,
Id2123
}
и с другой стороны, у меня есть публикация со всеми идентификаторами, совпадающими с массивом, но не в правильном порядке.
Как я могу отсортировать мой курсор Items.find()
следуя порядку моего другого массива документов?
1 ответ
Я просто понял, как это сделать. Вот как я поступил.
Помощник кормления моего #each
итерация не возвращает простой Items.find()
больше, чем версия отсортированного массива, сделанная с выделенной функцией. Теперь возвращается sortItems(Items.find())
И sortItems
функция выглядит так:
var sortItems= function(cursor) {
if(!cursor) {
return [];
}
var raw = cursor.fetch();
var project = Projects.findOne()
var sorted = [];
_.each( project.items, function(id){
_.each( raw, function(item){
if (item._id === id) {
sorted.push(item);
}
})
})
return sorted;
};