Я создал приложение, основанное на форме. Я хочу, чтобы пользователи могли частично заполнить форму, а затем вернуться к ней позже, если они не могут закончить ее в настоящее время. Я использовал железный маршрутизатор для создания уникального URL-адреса для каждого экземпляра формы, чтобы они могли вернуться к ссылке. Моя проблема заключается в том, что Meteor автоматически не сохраняет значения в входах, и форма появляется пустым, когда она повторно просматривается/обновляется. Я попробовал следующее решение для хранения данных во временном документе в отдельной сборке Mongo под названием «NewScreen», а затем ссылаюсь на этот документ каждый раз, когда шаблон (re) отображается, чтобы автоматически заполнить форму. Тем не менее, я все время получаю сообщение об ошибке, которое элемент, который я пытаюсь использовать, является «неопределенным». Странно то, что иногда это работает, иногда это не так. Я попытался установить рекурсивную функцию setTimeout, но в то время, когда она терпит неудачу, это тоже не работает. Любое понимание было бы весьма благодарным. Или, если я буду об этом все не так, не стесняйтесь предложить другой подход:Двусторонняя привязка данных для приложения Meteor
Screens = new Meteor.Collection('screens') //where data will ultimately be stored
Forms = new Meteor.Collection('forms') //Meteor pulls form questions from here
NewScreen = new Meteor.Collection('newscreen') //temporary storage collection
Roles = new Meteor.Collection('roles'); //displays list of metadata about screens in a dashboard
//dynamic routing for unique instance of blank form
Router.route('/forms/:_id', {
name: 'BlankForm',
data: function(){
return NewScreen.findOne({_id: this.params._id});
}
});
//onRendered function to pull data from NewScreen collection (this is where I get the error)
Template.BlankForm.onRendered(function(){
var new_screen = NewScreen.findOne({_id: window.location.href.split('/')[window.location.href.split('/').length-1]})
function do_work(){
if(typeof new_screen === 'undefined'){
console.log('waiting...');
Meteor.setTimeout(do_work, 100);
}else{
$('input')[0].value = new_screen.first;
for(i=0;i<new_screen.answers.length;i++){
$('textarea')[i].value = new_screen.answers[i];
}
}
}
do_work();
});
//onChange event that updates the NewScreen document when user updates value of input in the form
'change [id="on-change"]': function(e, tmpl){
var screen_data = [];
var name = $('input')[0].value;
for(i=0; i<$('textarea').length;i++){
screen_data.push($('textarea')[i].value);
}
Session.set("updateNewScreen", this._id);
NewScreen.update(
Session.get("updateNewScreen"),
{$set:
{
answers: screen_data,
first: name
}
});
console.log(screen_data);
}
Большое спасибо за помощь, Jos! Я рассмотрю это прямо сейчас и посмотрю, смогу ли я его отладить. –