【发布时间】:2015-11-23 19:18:56
【问题描述】:
我的意图是从集合中检索一个随机条目并将其显示在网站上 - 如果所有句子都通过(阅读:用户已经“看到”它们),则显示其他内容(因此返回一个虚拟句子)。但是,在服务器启动和按钮单击事件中,这个助手至少会被触发两次。这是一些代码:
在 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 逻辑不是我的强项)。
我的一个想法:用 Iron-router 实现整个想法是否会更简单?自动取款机。我想创建一个“单页应用程序” - 因此我认为我不需要路由器。
另一个问题:让这个逻辑起作用(用户得到一个他没有见过的随机句子)并发布小集合(因此客户端在使用前不必下载 5 MB 的数据)。
【问题讨论】:
标签: javascript mongodb meteor meteor-helper