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

Я хочу обновить 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;
};
Другие вопросы по тегам