Мое веб-приложение позволяет пользователям взаимодействовать с элементами. Эти предметы можно поместить в корзину и, таким образом, удалить из обычных предметов. У меня есть специальное подменю под названием «Корзина», где пользователи могут перерабатывать или удалять элементы, ранее помещенные в корзину.
Я хочу условно отображать меню корзины, только если в корзине есть элементы в зависимости от прав пользователя.
Однако я не хочу публиковать элементы в корзине до того, как пользователь перейдет в подменю корзины.
В настоящее время я вызываю метод, который возвращает флаг (есть или нет элементы в пользовательской корзине?). Но это не реактивно: если другой пользователь испортит элемент, подменю появится только после перезагрузки страницы.
Как я могу опубликовать реактивный логический флаг?
Я рассматривал возможность использования одного cursor.Observe()
для каждого меню/пользователя и уведомления о создании (через обновление) или удалении (через удаление) элемента с помощью publication.changed()
для поддельной опубликованной коллекции с одним элементом (с одним логическим полем), но это кажется излишним, учитывая ресурсы, используемые для задачи.
Я также подумал об обновлении специального поля в каждом профиле пользователя при изменении статуса элемента. Опять же, это слишком много операций для простой функции: мне нужно будет оценивать каждое право пользователя для каждой операции, связанной с изменением статуса элемента, и каждый раз, когда права пользователя меняются, переоценивать его право на переработку каждого элемента.
Менее трудоемкой альтернативой было бы обернуть вызов моего метода в меню template.Autorun()
. Однако это не реактивное решение, поскольку оно срабатывает только при повторном отображении меню.
Вы сталкивались с такой же проблемой? Есть ли у вас возможное альтернативное решение (с точки зрения производительности)?
Meteor.wrapAsync
для вызова метода метеора, который возвращает количество элементов в коллекции мусора. метод будет содержать что-то вродеreturn (trash.find({}).count()===0)
- person gatolgaj   schedule 06.10.2015Meteor.wrapAsync
afaik). Одним из обходных путей, о котором я не упомянул, было бы обернуть вызов функции вMeteor.setInterval
, но это не то решение, которое я ищу (слишком много ресурсов). - person Billybobbonnet   schedule 06.10.2015Template.menu.rendered()
и привязываю результат к реактивной переменной. Эта реактивная переменная возвращается помощником для установки соответствующего состояния в пользовательском интерфейсе (отображается кнопка меню). Подписка происходит только тогда, когда пользователь нажимает отображаемую кнопку меню. - person Billybobbonnet   schedule 06.10.2015