【发布时间】:2015-03-01 20:26:13
【问题描述】:
这是一个演示问题的模板。 randomArtist 是一个从 mongodb 返回文档的函数。我调用该函数 3 次,每次我使用该文档中的不同字段。
<template name="featuredArtist">
<p>{{randomArtist.artistName}}</p>
<p>{{randomArtist.description}}</p>
<p>{{randomArtist.randId}}</p>
</template>
这是一个模板逻辑。 在服务器启动时,我用一些数据初始化集合,因此(我认为)应该从一开始就可用于 View 部分。 在客户端上,我得到一个随机文档,然后将其 id (randId) 存储在会话中,以便在下一次函数调用期间跳过彩票。 (PS。这不是关键,但欢迎任何改进建议,我是Meteor的初学者。)
Artists = new Mongo.Collection("artists");
if (Meteor.isServer) {
Meteor.startup(function () {
Artists.insert({ randId: 0, artistName: "Artis Name 1", image: "url", description: "Description of Artis Name 1"});
Artists.insert({ randId: 1, artistName: "Artis Name 2", image: "url", description: "Description of Artis Name 2" });
Artists.insert({ randId: 2, artistName: "Artis Name 3", image: "url", description: "Description of Artis Name 3" });
Artists.insert({ randId: 3, artistName: "Artis Name 4", image: "url", description: "Description of Artis Name 4" });
Artists.insert({ randId: 4, artistName: "Artis Name 5", image: "url", description: "Description of Artis Name 5" });
});
}
if (Meteor.isClient) {
Meteor.subscribe("artists");
Template.featuredArtist.helpers({
randomArtist: function(){
var randId = Session.get("artistRandId");
if(!randId){
var rand = (Artists.find().count() * Math.random()) | 0;
var artist = Artists.findOne({randId:{$lte:rand}}, {sort: {randId: -1}});
if (!artist) {
artist = Artists.findOne( { randId : { $gte : rand } } );
}
if (!artist) {
console.log('Mongo.Artists is empty');
}
else {
console.log(artist);
Session.set("artistRandId", artist.randId);
return artist;
}
}
else {
console.log('randId='+randId);
return Artists.findOne( { randId: randId } );
}
}
});
}
工作演示在http://meteorpad.com/pad/MhwXS6MpXQoTYh4Lw/Artists
我在日志中观察到的是,“randomArtist”函数被调用了 7(!)次,而不是预期的 3 次,因为它在模板中被调用:
- 3 次 vs 预期 0:console.log('Mongo.Artists is empty');
- 1 次符合预期:console.log(artist);
- 3 次 vs 预期 2 次:console.log('randId='+randId);
谁能解释我这些额外的电话是从哪里来的? 在我的实际应用程序中,我可以观察到更多的调用 - 可能是因为我使用了更复杂的模板,这确实意味着 featureArtist 嵌入到另一个模板中。
还不清楚如何在日志中看到集合是空的,因为它似乎在启动时已填充?
【问题讨论】:
标签: meteor