我有一个定义发布/订阅行为的文件,但它只能运行10次。如果它不起作用,查询将返回未定义。我可以在chrome控制台中进行成功的查询,因此必须在查询触发后加载。
[project root] /lib/site.js
Articles = new Mongo.Collection("articles");
Authors = new Mongo.Collection("authors");
if (Meteor.isServer) {
Meteor.publish("articles", function () {
return Articles.find();
});
Meteor.publish("authors", function () {
return Authors.find();
});
}
if (Meteor.isClient) {
Meteor.subscribe("articles");
Meteor.subscribe("authors");
}
[project root] /client/modules/articleAdHelper.js
var getArticle = function (id) {
var article = Articles.findOne({articleID: id});
var author = Authors.findOne({_id: article.authorID});
article.authorName = author.authorName;
article.authorPageUrl = author.authorPageUrl;
article.authorAvatar = author.authorAvatar;
article.articlepublishTimePassedMessage = getPublishDateMessage(article.articlePublishDatetime);
return article;
};
var getAdUnit = function (unitKey) {
for (var i = 0; i < unitKey.length; i++) {
unitKey[i] = getArticle(unitKey[i]);
}
return {
m: [
unitKey[0],
unitKey[1]
],
h: [
unitKey[2],
unitKey[3],
unitKey[4],
unitKey[5]
]
}
};
var articleID = "testarticle";
var adUnitObj = getAdUnit([
"testarticle",
"claudeArticle",
"emusk",
"claudeArticle",
"testarticle",
"adCreatePageTest"
]);
Template.frontPageArticleAdUnit.helpers(adUnitObj);
答案 0 :(得分:0)
根本问题在于您只调用getAdUnit
一次,只有在调用时预订准备好后才能正常工作(如您所见)。我不清楚你是否想要一个非反应性的解决方案,所以我将提出两个选择:
<强>非反应性强>
如果您希望广告单元数据只生成一次(因此广告不会发生变化),那么您需要在呈现网页之前等待订阅。如果您使用的是铁路由器,则需要在路线上添加waitOn
挂钩。
<强>反应性强>
如果广告单元数据可以更改,则您需要为助手返回函数,而不是单个调用产生的单个对象。这样,当作者和文章可供客户使用时,数据将更新。
我建议在流星中使用警卫阅读this post。