Meteor 检测触发了哪个响应式查询

Meteor 检测触发了哪个响应式查询,meteor,Meteor,我有一个可能不是唯一的问题,那就是有一个复杂的meteor应用程序 我有几个操作导致页面的某些部分刷新,而这些部分实际上是不需要的。但是我很难找到哪个find()(或多个find())是被触发的。我知道有问题的藏品,只是不知道是哪个 我可以在我使用的每一个查找中使用observeChanges,但这将需要很多额外的代码 有没有一种简单的方法可以看到什么正在被什么触发 谢谢 这是一个渲染日志函数,您可能会发现它很有用。它记录每个模板呈现到控制台的次数。您知道,如果模板在初始页面加载后重新呈现,那是

我有一个可能不是唯一的问题,那就是有一个复杂的meteor应用程序

我有几个操作导致页面的某些部分刷新,而这些部分实际上是不需要的。但是我很难找到哪个find()(或多个find())是被触发的。我知道有问题的藏品,只是不知道是哪个

我可以在我使用的每一个查找中使用observeChanges,但这将需要很多额外的代码

有没有一种简单的方法可以看到什么正在被什么触发


谢谢

这是一个渲染日志函数,您可能会发现它很有用。它记录每个模板呈现到控制台的次数。您知道,如果模板在初始页面加载后重新呈现,那是因为它所依赖的被动数据源已更改。该被动数据源可以通过帮助器方法访问,或者模板是列表项(即在
{{{each…}}
块帮助器中),并且添加/移动/删除/更改了列表项。还要记住,在呈现或重新呈现子模板时,子模板会调用其父模板的呈现回调。因此,这可能会让您误以为父对象实际上已从DOM中移除并放回,但事实并非如此

因此,您可以在客户端代码末尾调用此函数以查看渲染计数:

函数logRenders(){
_.每个(模板、功能(模板、名称){
var oldRender=template.rendered;
var计数器=0;
template.rendered=函数(){
log(名称,“渲染计数:”,++计数器);
oldRender&&oldRender.apply(此参数);
};
});
}
编辑:以下是一种包装“查找”光标的方法,可将光标的所有更改记录到控制台。我刚刚为我正在开发的一个名为“反应式视觉”的新软件包编写了一个与此类似的函数。希望很快就能发布

var wrappedFind=Meteor.Collection.prototype.find;
Meteor.Collection.prototype.find=函数(){
var cursor=wrappedFind.apply(这是参数);
var collectionName=此。\u name;
cursor.observeChanges({
添加:函数(id、字段){
日志(collectionName,'added',id,字段);
},
更改:函数(id、字段){
日志(collectionName,'changed',id,字段);
},
movedBefore:函数(id,before){
log(collectionName,'movedBefore',id,before);
},
删除:函数(id){
日志(collectionName,'removed',id);
}
});
返回光标;
};

谢谢@cmather的建议

她是《流星1.3》的改编版,是《logRenders》的更高级版本

//记录所有呈现的模板
//如果设置了过滤器,则只记录过滤器中的模板
//@params filter-要筛选的模板的名称
logRenders=函数logRenders(过滤器){
for(对象(模板)中的名称){
if(filter&&!Array.isArray(filter))filter=[filter];
变量模板=模板[名称];
如果(!模板)继续;
if(filter&&filter.indexOf(name)=-1){
//清除以前的日志渲染
如果模板中的('oldRender')template.rendered=template.oldRender;
删除template.oldRender;
继续;
}
var t=函数(名称、模板){
如果(!('oldRender'在模板中))template.oldRender=template.rendered;
var计数器=0;
template.rendered=函数(){
console.log(名称++计数器,this);
this.oldRender&&this.oldRender.apply(this,参数);
};
}(名称、模板);
};
};

很酷,这非常有用。有没有办法查看哪个帮助程序或列表项实际生成了模板重建?我想我的总体问题可能是,有没有办法在全局范围内打开类似observeChanges的功能?不必在每次发现时都设置它。我必须考虑一种方法来实现它。你必须要有创意。有趣的是,昨天我在想是否有可能更新收集对象的原型来实现这一点。美好的由于在meteor的最新版本中,每个模板只调用一次
rendered
回调,因此
logRenders
函数不再像预期的那样工作。我找不到某种“重新招标”的回调,有人知道如何解决这个问题吗?