rubaxa:sortable (Meteor) умирает с ошибкой TypeError: templateInstance.collection.findOne не является функцией

Используя Meteor, я реализовал довольно простой экземпляр rubaxa:sortable. Не использовать несколько сортируемых списков или что-то необычное. Предварительно загруженные данные «заказа» в моей коллекции Mongo с уникальными номерами 1, 2, 3 и т. д.

Все отображается нормально и позволяет сортировать один раз, после чего пакет умирает при попытке сохранить новый порядок в БД.

Ошибка в консоли браузера:

TypeError: templateInstance.collection.findOne is not a function. (In 'templateInstance.collection.findOne(itemId)', 'templateInstance.collection.findOne' is undefined)
adjustOrdersrubaxa_sortable.js:1404
sortableUpdaterubaxa_sortable.js:1446
_dispatchEventrubaxa_sortable.js:1102
_onDroprubaxa_sortable.js:799
(anonymous function)
handleEventrubaxa_sortable.js:853

Соответствующие фрагменты кода ниже...

Сервер:

Products = new Mongo.Collection('products');
Sortable.collections = ['products'];`

Клиент JS:

Meteor.startup(function() {
  Mongo.Products = new Mongo.Collection('products');
});

HTML-код клиента:

<div class="sortable target" id="object">
  {{#sortable items=products animation="100" handle=".sortable-handle" ghostClass="sortable-ghost" sortField="order"}}
    {{> productSettingsRow}}
  {{/sortable}}
</div>`

<template name="productSettingsRow">
  <div data-id="{{order}}" class="sortable-item well well-sm">
    <div class="row">
    ...
    <div class="col s5">
      <div class="input-field">
        <input id="{{sku}}-displayName" type="text" value="{{displayName}}">
      </div>
    </div>
     ...
    <div class="col s1">
      <i class="sortable-handle mdi-action-view-headline pull-right"></i>
    </div>
  </div>
</div>

Tried searching on the error; don't see anything quite like this though #578 here seems similar(?): https://github.com/RubaXa/Sortable/issues/578

Любые предложения или любую другую информацию, которую я могу предоставить для отладки? (Также разместил это в репозитории GitHub, как было предложено.)


person Steve Reaser    schedule 02.02.2016    source источник


Ответы (2)


Вам необходимо определить коллекции как на клиенте, так и на сервере. Так что все, что вам может не хватать, это поставить:

Products = new Mongo.Collection('products');
Sortable.collections = ['products'];

в общем месте, например /lib/common.js.

person Christian Fritz    schedule 02.02.2016
comment
Спасибо, Кристиан - хорошая мысль. Это было не так... Я уже определяю коллекцию продуктов на клиенте (извините, я не включил это в свой фрагмент). В настоящее время я не указываю Sortable.collections = ['products']; на клиенте; из документов это не кажется необходимым; Я попробовал это только сейчас, просто чтобы быть уверенным, но безуспешно. - person Steve Reaser; 03.02.2016

Частичное решение найдено...

Помощник, который проходил в коллекции "products", был настроен следующим образом:

Template.productSettings.helpers({
  products : function() {
    return Mongo.Products.find().fetch();
  }
});

Это должно было быть:

Template.productSettings.helpers({
  products : function() {
    return Mongo.Products.find();
  }
});

Таким образом, это указатель, а не массив. rubaxa:sortable еще не обрабатывает массивы.

(Все еще решает проблему с хранилищем БД; этот плагин, похоже, не работает из коробки с Meteor - выдает «Отказано в доступе» при попытке обновления. Постараюсь разобраться с этим завтра.)

person Steve Reaser    schedule 03.02.2016