Мое намерение состоит в том, чтобы извлечь одну случайную запись из коллекции и отобразить ее на веб-сайте - если все предложения пройдены (читайте: пользователь «видел» их), отобразите что-то еще (поэтому возвращается фиктивное предложение). Но, при запуске сервера и при нажатии кнопки мыши, этот помощник запускается как минимум дважды. Вот код:Шаблон helper вызывается несколько раз
В 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», ничего не отображается.
Я не знаю, где находится мой «логический сбой»? Я новичок в метеоре, поэтому я мог бы упустить что-то очевидное.
Заранее спасибо :-)
UPDATE: Это, как я намеревался получить новое предложение и отобразить его:
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 МБ данных).
Спасибо, проблема теперь есть, он работает (он называется только один раз), но логика как-то не применяется - часть «Текущий пользователь не в разделе« Пользователи »не работает? например Я получаю предложение несколько раз (хотя в onRendered теперь он должен создать новый набор результатов, состоящий из предложений, которые этот пользователь не видел. –
Вы не показываете код, в котором вы переходите от предложения к предложению или где вы обновляете предложение как прочитано. –
Вот что я пытаюсь сделать атм. Я обновил вопрос. –