Я подозреваю, что не делаю этого способом Метеор. Я делаю общий интерактивный календарь.
У меня есть шаблон календаря:
<template name="calendar">
<h2>Calendar</h2>
<div class="calendar">{{#each days}}
{{> day}}
{{/each}}
</div>
</template>
С помощником, который возвращает объект дня:
{
date: thisDate.getDate(),
dateString: dateString,
done: done,
today: isToday
}
У меня есть шаблон дня:
<template name="day">
<div class="day {{stateString}}">{{date}}</div>
</template>
С некоторыми помощниками (meetingID
теперь жестко запрограммирован для разработки):
Template.day.helpers({
state: function(){
// retreive from DB
var s = Meetings.findOne({"_id":meetingID}).dates[this.dateString];
return s;
}
stateString: function(){
var stateString;
switch(this.state){
case -1: stateString = "unknown"; break;
case 0: stateString = "unavailable"; break;
case 1: stateString = "available"; break;
}
if(this.done) stateString = "done";
return stateString;
}
});
state() получает состояние из db, а stateString() выбирает правильное имя класса для этого состояния.
Когда вы нажимаете на него, вы циклически переключаете состояния (1: доступно, 0: недоступно, -1: неизвестно):
Template.day.events({
"click": function(){
if(this.done) return false; // no state changes for past days!
console.log(e);
var newState = this.state + 1;
if(newState > 1) newState = -1;
var q = "dates."+this.dateString+"."+Meteor.userId()+".state";
console.log(q+ " / "+this.state+" / "+newState);
Meetings.update(meetingID, {$set:{q:newState}});
return false;
}
})
У меня есть как минимум две проблемы:
1) Как мне вызвать помощника state() из события click? 2) Мое обновление db не работает - оно создает документ "q" вместо использования строки, хранящейся в q.
Я уверен, что это не дает основополагающего понимания правильного пути для этого - пожалуйста, помогите!