Как я могу опубликовать только реактивный логический флаг?

Мое веб-приложение позволяет пользователям взаимодействовать с элементами. Эти предметы можно поместить в корзину и, таким образом, удалить из обычных предметов. У меня есть специальное подменю под названием «Корзина», где пользователи могут перерабатывать или удалять элементы, ранее помещенные в корзину.

Я хочу условно отображать меню корзины, только если в корзине есть элементы в зависимости от прав пользователя.

Однако я не хочу публиковать элементы в корзине до того, как пользователь перейдет в подменю корзины.

В настоящее время я вызываю метод, который возвращает флаг (есть или нет элементы в пользовательской корзине?). Но это не реактивно: если другой пользователь испортит элемент, подменю появится только после перезагрузки страницы.

Как я могу опубликовать реактивный логический флаг?

Я рассматривал возможность использования одного cursor.Observe() для каждого меню/пользователя и уведомления о создании (через обновление) или удалении (через удаление) элемента с помощью publication.changed() для поддельной опубликованной коллекции с одним элементом (с одним логическим полем), но это кажется излишним, учитывая ресурсы, используемые для задачи.

Я также подумал об обновлении специального поля в каждом профиле пользователя при изменении статуса элемента. Опять же, это слишком много операций для простой функции: мне нужно будет оценивать каждое право пользователя для каждой операции, связанной с изменением статуса элемента, и каждый раз, когда права пользователя меняются, переоценивать его право на переработку каждого элемента.

Менее трудоемкой альтернативой было бы обернуть вызов моего метода в меню template.Autorun(). Однако это не реактивное решение, поскольку оно срабатывает только при повторном отображении меню.

Вы сталкивались с такой же проблемой? Есть ли у вас возможное альтернативное решение (с точки зрения производительности)?


person Billybobbonnet    schedule 06.10.2015    source источник
comment
я не уверен, что такое Сложность. Почему бы вам не использовать реактивную переменную. пожалуйста, следуйте (ссылка) [atmospherejs.com/meteor/reactive-var]   -  person gatolgaj    schedule 06.10.2015
comment
Реактивная переменная, как и реактивный словарь, является функцией на стороне клиента. Моя проблема здесь заключается в том, чтобы реактивно уведомить клиента о существовании элементов в корзине без их отправки. Это то, что вычисляется на сервере и обслуживается клиентом в зависимости от его прав пользователя. В основном я ищу особенности публикации для одной булевой переменной.   -  person Billybobbonnet    schedule 06.10.2015
comment
Как насчет использования Meteor.wrapAsync для вызова метода метеора, который возвращает количество элементов в коллекции мусора. метод будет содержать что-то вроде return (trash.find({}).count()===0)   -  person gatolgaj    schedule 06.10.2015
comment
Мне не нужен синхронный метод. Мой асинхронный метод работает хорошо, его проблема в том, что он не является реактивным (как это было бы для методов, завернутых в Meteor.wrapAsync afaik). Одним из обходных путей, о котором я не упомянул, было бы обернуть вызов функции в Meteor.setInterval, но это не то решение, которое я ищу (слишком много ресурсов).   -  person Billybobbonnet    schedule 06.10.2015
comment
Я, наверное, тупой, поэтому, пожалуйста, научите меня здесь. Это звучит так: вы хотите, чтобы что-то всплывало на экране вашего пользователя, когда кто-то кладет что-то в корзину. Если это так, почему бы не добавить функцию, которая устанавливает переменную, за которой следит ваш шаблон? Таким образом, они узнают, что он включен, и вы можете запустить публикацию, если они захотят.   -  person Tim Roberts    schedule 06.10.2015
comment
Пожалуйста, проверьте этот пакет, который может дать вам реактивный способ подсчета. github.com/percolatestudio/publish-counts   -  person gatolgaj    schedule 06.10.2015
comment
@TimRoberts, когда кто-то не совсем кладет что-то в корзину, я должен проверить права пользователей, чтобы увидеть элемент, в зависимости от его владельца. Ваш подход на самом деле похож на мой, я вызываю свой метод в функции Template.menu.rendered() и привязываю результат к реактивной переменной. Эта реактивная переменная возвращается помощником для установки соответствующего состояния в пользовательском интерфейсе (отображается кнопка меню). Подписка происходит только тогда, когда пользователь нажимает отображаемую кнопку меню.   -  person Billybobbonnet    schedule 06.10.2015
comment
@gatolgaj Спасибо за ссылку, это интересный пакет. Я закончу тем, что создам специальную публикацию с этим подходом, но это может быть хорошим способом. Я попробую и буду держать вас в курсе, чтобы вы могли опубликовать его как ответ, если он вас удовлетворит.   -  person Billybobbonnet    schedule 06.10.2015
comment
Это может помочь.   -  person Tim Roberts    schedule 06.10.2015
comment
@gatolgaj Это работает нормально. Я до сих пор не уверен в влиянии на производительность, но он выполняет свою работу с помощью специального счетчика публикаций (без заполнения коллекции на текущей странице удаленными элементами). Вы можете опубликовать ответ, я проверю его.   -  person Billybobbonnet    schedule 06.10.2015
comment
@ Тим Робертс спасибо за ссылку. Я знал об этой технике оттуда: реактивная публикация с дополнительными полями в каждом документе">stackoverflow.com/questions/30807390/. Пакетный подход подсчета публикаций, наконец, делает то же самое (используя наблюдателей), но с большим количеством сахара.   -  person Billybobbonnet    schedule 06.10.2015


Ответы (1)


  1. Создайте новую коллекцию, например: TrashBinState, содержащую документ с (предположительно общим) состоянием вашей корзины.
  2. Обновлять этот документ на стороне сервера всякий раз, когда элемент удаляется.
  3. Опубликовать
  4. Пусть каждый клиент подпишется на эту публикацию
person Michel Floyd    schedule 06.10.2015