我的目的是从集合中检索一个随机条目并将其显示在网站上 - 如果所有句子都通过(读取:用户已“看到”它们),则显示其他内容(因此返回虚拟句子)。但是,在服务器启动和按钮单击事件上,此助手至少会被触发两次。这是一些代码:
在client.js中:
Template.registerHelper('random_sentence', function() {
fetched = _.shuffle(Sentences.find({
users: {
$nin: [this.userId]
}
}).fetch())[0];
if (fetched === undefined) {
return {
sentence: "done",
_id: 0,
done: true
};
}
Session.set('question', fetched._id);
console.log(fetched);
return fetched;
});
模板的辅助函数:
sent: function(){
sent = Session.get('question');
return Sentences.findOne(sent);
}
在主模板中:
{{#with random_sentence}}
{{#if done}}
<!-- Display something else -->
{{else}}
<div class="container">
{{> question}}
</div>
{{/if}}
{{/with}}
“问题”模板:
<div class="well">
<div class="panel-body text-center">
<h3>{{sent.sentence}}</h3>
</div>
</div>
如果我没有在“random_sentences”函数中返回任何内容,则不会显示任何内容。
我不知道我的“逻辑失败”在哪里?我是流星的新手 - 所以我可能会忽略一些明显的东西。
提前致谢: - )
更新:这就是我打算获取新句子并显示它的方式:
Template.answer.events({
'click': function(event) {
var text = event.target.getAttribute('id');
if (text !== null) {
var question = Session.get('question');
var setModifier = {
$inc: {}
};
setModifier.$inc[text] = 1;
Sentences.update(question, setModifier);
Meteor.call('update_user', question);
Notifications.success('Danke!', 'Deine Beurteilung wurde gespeichert.');
Blaze.render(Template.question, document.head);
}
}
});
在server.js中(更新问题和用户的计数器):
Meteor.methods({
update_user: function(question) {
Sentences.update(question, {
$push: {
"users": this.userId
}
});
Meteor.users.update({
_id: this.userId
}, {
$inc: {
"profile.counter": 1
}
});
},
});
我在网络上找到了Blaze.render功能。 “document.head”部分只是因为这个函数需要一个DOM元素来渲染,而且因为document.body只是“倍增”了身体,所以我把它移到了头部。 (DOM逻辑不是我的强项)。
我有一个想法:它会使整个想法更简单地用铁路由器实现吗?大气压。我想创建一个“单页应用程序” - 因此我认为我不需要路由器。
另一个问题:让这个逻辑起作用(用户获得一个他没有看到的随机句子)并发布小集合(因此客户端在使用之前不必下载5 MB数据)。 / p>
答案 0 :(得分:0)
模板助手可以多次调用,因此最好避免使它们成为有状态。你最好选择 onCreated 或 onRendered template handler.中的随机条目。你可以随意选择,更新状态,然后选择一个由助手检索的Session变量。