#meteor
#метеор
Вопрос:
В настоящее время я создаю приложение с помощью meteor, изучая его во время сборки. Я пытаюсь включить сеансы вместо того, чтобы записывать все в базу данных (что я делал). В моем понимании сеанс — это глобальный объект, который хранит пары ключ-значение и является реактивным. Поэтому я подумал, что это будет отличным выбором для использования для специфики рендеринга шаблонов в моей простой игре. Моя цель — небольшая игра, и разные шаги будут отображаться в шаблоне для каждого игрока на основе определенного действия, которое они совершили.
Я переписал свое приложение и хотел использовать Session таким образом (упрощенный, конечно).
Мой шаблон:
<template name="gameRoom">
<button id='click'>click</button>
{{#if lastAction}}
{{>waiting}}
{{/if}}
</template>
Template.gameRoom.events({
lastAction: function() {
return Session.get('lastAction') === Meteor.userId();
};
})
Template.gameRoom.helpers({
'click #click' : function() {
Session.set('lastAction', Meteor.userId());
};
})
Однако это работает не так, как я думал, что это сработает. Похоже, что каждый сеанс индивидуален для каждого пользователя (что имеет смысл, конечно, учитывая, что это (своего рода) замена файлов cookie).
Итак, мой вопрос:
- Есть ли хорошая альтернатива для сеансов? Мне действительно нужна альтернатива или для этого используется база данных? Как насчет локальной базы данных?
Ответ №1:
Ваши events
helpers
функции и выполнены в обратном направлении, вам не хватает пары фигурных скобок, а ваш ключ события (идентификатор кнопки) неверен. Попробуйте это:
Template.gameRoom.helpers({
lastAction: function() {
return Session.equals('lastAction', Meteor.userId());
}
});
Template.gameRoom.events({
'click #click': function() {
Session.set('lastAction', Meteor.userId());
}
});
Редактировать: из того, что вы пытаетесь сделать, может иметь смысл сделать что-то вроде этого:
Actions = new Meteor.Collection('actions');
if (Meteor.isClient) {
Template.gameRoom.events({
'click #click': function() {
Actions.insert({userId: Meteor.userId()});
}
});
Template.gameRoom.helpers({
lastAction: function() {
var lastAction = Actions.findOne() || {};
return lastAction.userId === Meteor.userId();
}
});
}
Комментарии:
1. Спасибо, я не знал о сеансе. равно пока :). Однако, возможно, я неправильно понимаю ваш комментарий. Но моя цель такова: если один пользователь нажмет кнопку, шаблон будет показан ТОЛЬКО этому пользователю. Но я думаю, что Session — это неправильный инструмент, поэтому я спросил, какая лучшая альтернатива для этого.
2. Для этого вы можете использовать базу данных. Смотрите мое редактирование. Обратите внимание, что вам все равно нужно добавить разрешающее правило для
insert
, которое запрещает пользователям выполнять 2 действия подряд.3. Спасибо. Было немного грязно писать об использовании базы данных для этого. Спасибо, что прояснили это 🙂