【问题标题】:How can I publish a reactive boolean flag only?如何仅发布反应性布尔标志?
【发布时间】:2026-01-30 17:45:02
【问题描述】:

我的 webapp 允许其用户与项目进行交互。这些物品可以放入垃圾箱,从而从常规物品中删除。我有一个名为“垃圾箱”的专用子菜单,用户可以在其中回收或删除以前放入垃圾箱的项目。

我想根据用户权限有条件地显示垃圾箱菜单,前提是垃圾箱中有项目。

但是,我不想在用户进入垃圾箱子菜单之前发布垃圾箱中的项目。

我目前所做的是调用一个返回标志的方法(用户垃圾箱中是否有项目?)。但这不是反应性的:如果另一个用户删除了一个项目,子菜单只会在页面重新加载后出现。

如何发布反应性布尔标志?

我考虑为每个菜单/用户使用一个cursor.Observe(),并使用publication.changed() 通知一个项目的创建(通过更新)或删除(通过删除)在一个带有一个项目(带有一个布尔字段)的假发布集合上但考虑到用于该任务的资源,这似乎有点过头了。

我还考虑在项目状态更改时更新每个用户配置文件中的专用字段。再说一次,对于一个简单的功能来说,这操作太多了:我需要为每个涉及项目状态更改的操作评估每个用户权限,并且每次用户权限更改时,重新评估他回收每个项目的权限。

消耗较少的替代方法是将我的方法调用包装在菜单template.Autorun() 中。但是,这不是反应式解决方案,因为它仅在重新呈现菜单时触发。

您是否遇到过同样的问题?您是否有可能的替代解决方案(性能方面)?

【问题讨论】:

  • 我不确定复杂性是什么。为什么不使用反应变量。请关注(链接)[atmospherejs.com/meteor/reactive-var]
  • 反应变量以及反应字典是客户端功能。我的问题是在不发送垃圾箱的情况下向客户反应性地通知垃圾箱中存在物品。这是在服务器上计算并根据用户权限在客户端上提供的东西。基本上,我正在为单个布尔变量寻找出版物的特征。
  • 如何使用Meteor.wrapAsync 调用返回垃圾收集项目计数的流星方法。方法将包含类似return (trash.find({}).count()===0)
  • 我不需要同步方法。我的 async 方法效果很好,它的问题是它不是反应式的(就像包装在 Meteor.wrapAsync afaik 中的方法一样)。我没有提到的一种解决方法是将函数调用包装在 Meteor.setInterval 中,但这不是我正在寻找的解决方案(消耗资源过多)。
  • 我可能很笨,所以请在这里教我。这听起来像是当有人将东西放入垃圾箱时,您希望在用户屏幕上弹出一些东西。如果这是真的,为什么不添加一个设置模板监视的变量的函数呢?这样他们就知道它已打开,您可以根据需要运行您的发布。

标签: meteor meteor-publications


【解决方案1】:
  1. 创建一个新集合,例如:TrashBinState,其中包含一个文档,该文档具有您的垃圾桶的(可能是共享的)状态
  2. 每当项目被丢弃时更新该文档服务器端
  3. 发布它
  4. 让每个客户都订阅该出版物

【讨论】: