2015-08-29 10 views
1

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

ответ

0

Шаблоны-помощники можно назвать несколько раз, поэтому полезно избегать их состояния. Вам лучше выбрать случайную запись в onCreated или onRenderedtemplate handler. Здесь вы можете сделать свой случайный выбор, обновить состояние и поместить свой выбор в переменную сеанса, которую должен получить помощник.

+0

Спасибо, проблема теперь есть, он работает (он называется только один раз), но логика как-то не применяется - часть «Текущий пользователь не в разделе« Пользователи »не работает? например Я получаю предложение несколько раз (хотя в onRendered теперь он должен создать новый набор результатов, состоящий из предложений, которые этот пользователь не видел. –

+0

Вы не показываете код, в котором вы переходите от предложения к предложению или где вы обновляете предложение как прочитано. –

+0

Вот что я пытаюсь сделать атм. Я обновил вопрос. –

Смежные вопросы