我现在已经在我的Meteor / Blaze应用程序中使用this模式进行模板级订阅。
然而,在升级到Meteor 1.4.3.2后,我的某个模板似乎有一个奇怪的错误。
我有这个出版物:
Meteor.publish('reports.byId', function(reportId){
console.log("subscribe reports.byId", reportId);
const reports = Reports.find({_id: reportId});
console.log(reports.count());
return reports;
});
我已经删除了对用户权限的任何验证,并添加了写入以检查我是否真正获得了数据等。
现在我使用这个onCreated方法调用它:
Template.manageReport.onCreated(function(){
const instance = this;
const reportId = FlowRouter.getParam("reportId");
instance.autorun(function(){
const reportSub = instance.subscribe('reports.byId', reportId);
if (reportSub.ready()){
console.log("ready");
}
});
});
奇怪的是:如果我删除了检查订阅是否准备就绪,一切都按预期工作。一旦我检查订阅准备就绪,订阅就永远不会准备好,我可以通过服务器上的日志消息看到请求订阅的速度是每秒几十次。
答案 0 :(得分:0)
是的,reportSub.ready()
是被动的,因此它会触发自动运行。实际上它是触发你自动运行的唯一因素。订阅准备好后,它会触发自动运行,然后它就不再准备就绪,因为你刚刚再次调用它。这是一个循环。
我认为你不应该打电话给instance.subscribe
并在同一个自动运行中检查它的准备情况。
由于reportId
是一个路由参数,并且它不会改变,因此您不需要为订阅自动运行。如果任何参数是可能发生变化的反应变量,则只需要它。
这应该可以正常工作。让我知道它是怎么回事。
Template.manageReport.onCreated(function() {
const instance = this;
const reportId = FlowRouter.getParam("reportId");
// Create subscription
const reportSub = instance.subscribe('reports.byId', reportId);
// Check when subscription is ready
instance.autorun(function() {
if (reportSub.ready()) {
console.log("ready");
}
});
});