2015-12-03 3 views
0

Я создал приложение, основанное на форме. Я хочу, чтобы пользователи могли частично заполнить форму, а затем вернуться к ней позже, если они не могут закончить ее в настоящее время. Я использовал железный маршрутизатор для создания уникального 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); 
    } 

ответ

0

Если вы undefined, что может означать findOne() не нашли newscreen с Id, который был принят в от url. Чтобы исследовать это, добавьте дополнительную строку, например console.log(window.location.href.split('/')[window.location.href.split('/').length-1], JSON.stringify(new_screen)); . Это даст вам и Идентификатор из URL-адреса и найденного нового_screen.

Я бы рекомендовал использовать Router.current().location.get().path вместо window.location.href, так как вы используете ИК.

И если вы ищете двустороннюю привязку в клиенте, посмотрите на Viewmodel for Meteor.

+0

Большое спасибо за помощь, Jos! Я рассмотрю это прямо сейчас и посмотрю, смогу ли я его отладить. –

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