以下是该方案。我有一个包含#each循环的模板,并呈现特定模板的实例,根据文档在每个模板上设置数据上下文。
<template name = 'live'>
<div class = 'row'>
{{#each runways}}
<div class = 'col-md-2'>
{{> runway_panel}}
</div>
{{/each}}
</div>
</template>
这是支持它的帮手:
Template.live.helpers({
runways: function(){
return Runway_Data.find();
}
});
这个有效,我的问题如下。每个live_event_log实例都有一个模板级订阅,订阅了一个采用数据上下文的_id参数的发布,如下所示:
Template.runway_panel.onCreated(function(){
var instance = this;
instance.autorun(function(){
var subscription = instance.subscribe('runway_status', this.data._id);
});
instance.status = function(){
return Runway_Status.find();
}
});
这是出版物:
Meteor.publish('runway_status', function(runway){
if(this.userId){
//Retrieve the last know status for the given runway
return Runway_Status.find({runway: runway});
}
});
这一切都崩溃了,我在浏览器控制台上得到了这个:
[Log] Exception in queued task: http://localhost:3000/client/views/live/runway_panel.js?4efaac87b39527d3dfd3d65a174520f9bce3c565:4:73 (meteor.js, line 888)_withTemplateInstanceFunc@http://localhost:3000/packages/blaze.js?a5c324925e5f6e800a4c618d71caf2848b53bf51:3476:16
http://localhost:3000/packages/blaze.js?a5c324925e5f6e800a4c618d71caf2848b53bf51:1864:54
_withCurrentView@http://localhost:3000/packages/blaze.js?a5c324925e5f6e800a4c618d71caf2848b53bf51:2197:16
一旦我在订阅线上发表评论,其他所有内容都有效,我是否遗漏了一些非常明显的内容?它可能与同一出版物的多个订阅有关吗?
谢谢! :)
解
感谢Jeremy S.的投入以及夜班后的一些睡眠,我终于在没有自动运行的情况下想出来了。所以这里适合后人:
Template.runway_panel.onCreated(function(){
var self = this;
self.subscribe('runway_status', this.data._id);
});
在再次尝试之前,应该尝试睡一觉!
答案 0 :(得分:0)
首先,userId是一个函数,userId()将返回当前用户ID。您可以查看here以了解instance.subscribe
的详细信息。
我认为在runway._id
Meteor.publish
时可能会出现问题
Template.runway_panel.onCreated(function(){
var instance = this;
// instance subscribe data whose _id is runwayPanelId
instance.autorun(function(){
var dataContext = Template.currentData();
var subscription = instance.subscribe('runway_status', dataContext.runwayPanelId);
});
instance.status = function(){
return Runway_Status.find();
}
});
// publication
Meteor.publish('runway_status', function(runway){
// using Meteor.userId() to get current user id
if(Meteor.userId()){
//Retrieve the last know status for the given runway
return Runway_Status.find({runway: runway});
}
});
<template name = 'live'>
<div class = 'row'>
{{#each runways}}
<div class = 'col-md-2'>
{{> runway_panel runwayPanelId=_id}}
</div>
{{/each}}
</div>
</template>
答案 1 :(得分:0)
问题在于订阅中的this.data._id
,现在它的作用域是最里面的函数。您需要instance.data._id
(不反应,因此您不需要autorun
)或Template.currentData()
(这是被动的)。
Template.runway_panel.onCreated(function(){
var instance = this;
instance.autorun(function(){
var data = Template.currentData();
var subscription = instance.subscribe('runway_status', data._id);
});
});
另请注意,在您的出版物中,如果this.ready()
为this.userId
,则应将其标记为undefined
。但那并不是错误的根源。