Javascript 动态打开和关闭订阅以限制接收到的缓存;未捕获类型错误:将循环结构转换为JSON;

Javascript 动态打开和关闭订阅以限制接收到的缓存;未捕获类型错误:将循环结构转换为JSON;,javascript,mongodb,meteor,Javascript,Mongodb,Meteor,为了限制客户端的缓存,我们认为可以打开或关闭对特定集合的订阅,方法是按照Meteor文档的建议,将该集合的Meteor.subscribe放在Meteor.render中-此外,在被动上下文中调用Meteor.subscribe将设置一个订阅,该订阅在上下文无效时自动停止 然而,我们不断得到“uncaughttypeerror:将循环结构转换为JSON”错误 程序流程如下所示: Appliances = new Meteor.Collection 'appliances' Alerts = ne

为了限制客户端的缓存,我们认为可以打开或关闭对特定集合的订阅,方法是按照Meteor文档的建议,将该集合的Meteor.subscribe放在Meteor.render中-此外,在被动上下文中调用Meteor.subscribe将设置一个订阅,该订阅在上下文无效时自动停止

然而,我们不断得到“uncaughttypeerror:将循环结构转换为JSON”错误

程序流程如下所示:

Appliances = new Meteor.Collection 'appliances'
Alerts = new Meteor.Collection 'alerts'
在客户端

under Meteor.startup subscribes to collection 'appliances'
Meteor.subscribe ('appliances')
Use Appliances.find{}.observe to monitor changes
检测到新设备项目时,请使用Meteor.render重新主动订阅警报并列出该项目的所有警报

Meteor.render(function() {Meteor.subscribe(Alerts); .....}

知道我做错了什么吗?建议?

我不知道您的错误消息来自何处。但您可以使用
Deps.autorun()
和会话变量轻松归档“仅在必要时”订阅:

客户机上的任何位置:

Deps.autorun(function () {
  if (!Session.get('isViewingAlerts')) Meteor.subscribe('alerts');
});
如果现在使用
Session.set('isViewingAlerts',false)
,则自动运行函数中的代码将失效并重新执行

此外,您还可以通过向发布函数“警报”添加一个参数来订阅警报子集

编辑:
我最近遇到了一个问题,使用动态订阅时模板没有反应。因为订阅没有加载到重画上。为了解决这个问题,我们对Metor.subcribe使用了一个回调,它更改了一个会话变量,使模板的呈现依赖于订阅准备就绪,从而获得反应

-最好的,
Jan

Meteor document:“这些Meteor函数在反应式上下文中运行代码:•模板•Meteor.render和Meteor.renderList•Meteor.autorun,可以触发更改的反应式数据源是:•会话变量•集合上的数据库查询•Meteor.status•就绪()订阅句柄上的方法•Meteor.user•Meteor.userId•Meteor.logging此外,在反应上下文中调用Meteor.subscribe将设置订阅,该订阅在上下文无效时自动停止“它提供了Meteor.autorun的示例,Meteor.subscribe的示例?我确实通过修改服务器发布来限制检索到的数据,从而限制了发送到客户端的数据量。我使用Meteor.render在查看网页时自动刷新网页,我认为Meteor.autorun无法实现这一点。我没有使用Meteor.autorun来控制我的订阅,而是手动订阅和取消订阅(使用订阅句柄的stop()函数)。soo。。您是否不使用模板而是使用自己的呈现函数来生成html?Meteor.autorun也可以建立,但当然不能返回html。无论如何,render方法不应该包含subscribe调用。我确实使用Meteor.render的模板。我需要研究如何使用Meteor.autorun。调用Meteor.autorun进行动态订阅(当选项卡处于会话中时),然后使用Meteor.render绘制警报是否合理?确定。我想我终于明白了。这可能是真的,我不能在Meteor.render下使用Meteor.subscribe。我按照您的建议修改了代码以使用Meter.autorun。从文档中可以看出,会话变量changed需要是Meteor.subscribe参数的一部分,以触发subscribe。顺便说一句,在最新版本的Meteor中,Meteor.autorun似乎已更改为Deps.autorun。谢谢你的帮助!