2015-12-02 6 views
0

Итак, я создал приложение, которое в основном позволяет моим товарищам по команде заполнять и отправлять формы. В оригинальном тестировании Meteor будет случайным образом обновлять страницу (даже если никакие зависимые источники данных не были обновлены), и они потеряют информацию, уже введенную в форму. Поэтому я взломал двухстороннее решение привязки данных, создав приложение для создания временного документа в отдельной коллекции Mongo, которая будет хранить данные формы до тех пор, пока пользователь не завершит и не отправит форму - в этот момент приложение удаляет временный документ. Я также использовал железный маршрутизатор для динамического создания уникальной страницы с использованием идентификатора нового документа.Расписание Монго сбора коллекции в приложении Meteor

Моя проблема заключается в том, что если пользователь не отправляет или не отменяет форму, документ не удаляется, и я оставляю кучу ненужных данных. Я хочу запланировать еженедельную очистку этой коллекции Meteor, но я не знаю, как это сделать. Я не уверен, что код актуально здесь, но я включил событие, которое создает и удаляет временный документ:

Screens = new Meteor.Collection('screens') // where forms will ultimately be stored 
Forms = new Meteor.Collection('forms') // form templates 
NewScreen = new Meteor.Collection('newscreen') //used for temporary data storage 

//event that generates temporary object when users start new form 
'click [name=new-screen]': function(e, tmpl) { 
     NewScreen.insert({ 
     first: '', 
     role: this.position_name, 
     answers: [], 
     form_id: this._id, 
     position_name: this.position_name, 
     form_bundle: this.form_bundle, 
     created_at: new Date 
     }); 


//event that stores form data in the final collection, and removes the temporary storage document 

'click [name=submit]': function(e, tmpl) { 
     e.preventDefault(); 

     var newObj = {}; 
     var q_elements = $('.question-form li'); 
     var a_elements = $('textarea'); 
     var ca_elements = $('.correct-answer'); 
     var qa_bundle = [] 

     for(i=0; i<q_elements.length; i++){ 
     myObj={} 
     myObj['question'] = q_elements[i].innerHTML; 
     myObj['answer'] = a_elements[i+1].value; 
     myObj['correct_answer'] = ca_elements[i].innerHTML.split('</b> ')[1]; 
     qa_bundle.push(myObj); 
     } 

     newObj['name'] = $('input')[0].value; 
     newObj['prescreen_notes'] = $('#prescreen-notes')[0].value; 
     newObj['role'] = this.position_name; 
     newObj['qa_bundle'] = qa_bundle; 
     newObj['created_at'] = new Date; 


     Screens.insert(newObj); 

     for(i=0;i<$('input').length; i++){ 
     $('input')[i].value = ''; 
     } 

     for(i=0;i<$('textarea').length; i++){ 
     $('textarea')[i].value = ''; 
     } 

     $('#new-id')[0].innerHTML = 'Link to candidate prescreen: <a href="/screens/' + Screens.find().fetch()[Screens.find().fetch().length-1]._id +'">' + Screens.find().fetch()[Screens.find().fetch().length-1]._id + '</a>'; 

     NewScreen.remove({_id: window.location.pathname.split('/')[window.location.pathname.split('/').length-1]}) 
    }, 

Если это поможет, я совершил версию приложения, что «метеорит build ", чтобы сделать его node.js app, для github repo здесь: https://github.com/gharezlak/prescreens

ответ

0

Я думаю, что вы можете установить время ожидания , когда пользователь запрашивает форму. Время события может быть часов или дней на основе логики приложения.

Когда вы даже подняли, вы проверите, была ли отправлена ​​форма, и при необходимости очистите один документ.

+0

Благодарим за ответ! Я собираюсь попробовать это и пару других предлагаемых решений, и посмотреть, какой из них лучше всего работает. –

0

Используйте synced-cron пакет

SyncedCron.add({ 
    name: 'Cleanup NewScreen Colleciton', 
    schedule: function(parser) { 
    return parser.text('every weekend'); 
    }, 
    job: function() { 
    var date = new Date(); 
    date.setDate(date.getDate() - 1); // 1 day ago 
    NewScreen.remove({createdAt: { $lt: date }}) 
    } 
}); 

Однако, вы можете быть лучше хранить эти временные значения в LocalStorage клиентской.

+0

Большое спасибо за ответ! Я собираюсь попытаться реализовать это сегодня. –

+0

Работает как шарм :) Еще раз спасибо! –