2015-11-27 4 views
0

Я хочу обновить SpaceBars @index родной помощник, когда я сортирую элементы, отображаемые внутри итерации #each. Я предполагаю, что правильный способ сделать это - отсортировать курсор, который я использую в #each.Как я могу отсортировать курсор с помощью идентификаторов из другого массива документов?

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

После того, как я удаляю элемент в его новой позиции, я обновляю каждый элемент index в массиве документов проекта с использованием сортируемой функции stop. Для этого сначала сделайте это, затем $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 
        } 
       } 
       }) 
      } 

Как вы можете видеть, я использую указательный свойство моего элемента в указанной выше функции (например $position:after.dataset.index -1). Это то, что я хочу обновить, сортируя мой курсор.

Чтобы подвести итог, с одной стороны, у меня есть упорядоченный (с использованием индекса) массив идентификаторов; Пример:

items : { 
    Id2131, 
    Id4233, 
    Id2243, 
    Id2331, 
    Id2455, 
    Id2123 
} 

, а с другой стороны, у меня есть издание со всеми идентификаторами соответствия массива, но не в правильном порядке.

Как я могу сортировать мой курсор Items.find(), следуя порядку моего другого массива документов?

ответ

0

Я только что понял, как это сделать. Вот как я продолжил.

Помощник, подающий мою #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; 
};