在Meteor应用程序

时间:2015-12-02 19:25:08

标签: javascript node.js forms mongodb meteor

所以我创建了一个基本上允许我的队友填写并提交表单的应用程序。在原始测试中,Meteor将随机刷新页面(即使没有相关数据源已更新),它们将丢失已在表单中输入的信息。所以我通过让应用程序在一个单独的Mongo集合中生成一个临时文档来修复一个双向数据绑定解决方案,该文档将存储表单数据,直到用户完成并提交表单 - 此时,应用程序删除了临时文件。我还使用铁路由器使用新文档的id动态生成一个唯一的页面。

我的问题是,如果用户没有提交或取消表单,则文档不会被删除,而且我留下了一堆不必要的数据。我想安排每周清理那个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]})  
    },

如果有帮助,我已经提交了“meteor build”命令吐出的应用程序版本,使其成为一个node.js应用程序,这里是一个github repo:https://github.com/gharezlak/prescreens

2 个答案:

答案 0 :(得分:0)

我认为您可以设置超时事件 当用户要求表格时。 根据您的应用程序逻辑,事件时间可以是几小时或几天。

甚至在成立时,您将检查表单是否已提交, 如果需要,可以清理单个文件。

答案 1 :(得分: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中。