2015-12-02 30 views
0

所以我創建了一個基本上允許我的隊友填寫和提交表單的應用程序。在原始測試中,Meteor會隨機刷新頁面(即使沒有更新依賴數據源),他們也會丟失已經在表單中輸入的信息。所以我通過讓應用程序在一個單獨的Mongo集合中生成一個臨時文檔來入侵雙向數據綁定解決方案,該集合將存儲表單數據,直到用戶完成並提交表單 - 此時,應用程序將刪除臨時文件。我還使用鐵路路由器,使用新文檔的ID動態生成唯一頁面。在Meteor應用程序中安排Mongo收集清理

我的問題是,如果用戶沒有提交或取消表單,文檔不會被刪除,我留下一堆不必要的數據。我想安排每週清理一次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]}) 
    }, 

如果有幫助,我已經提交了該應用程序的版本是,「流星構建「命令吐出來使它成爲一個node.js應用程序,以github回購這裏: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

工程就像一個魅力:)再次感謝! –