2016-01-24 31 views
1

我有一个表格,其中coverImage和附件是可选的。但是,目前用户必须填写所有表单。如果不是,流星打印警告:流星:只有当值存在时才将字段插入到MongoDB中

Uncaught ReferenceError: imageIdVar is not defined

我明白这个错误信息来自哪里。

那么,如何在将文档插入到集合中时使字段可选?

我的模板助手:

Template.adminNewsEvents.events({ 
    'change #coverImage': function(evt, temp) { 
    /* FS.Utility.eachFile(event, function(file) { 
     Images.insert(file, function (err, fileObj) { 
     // Inserted new doc with ID fileObj._id, and kicked off the data upload using HTTP 
     if (err) throw err; 
     }); 
    }); */ 

     var image = event.target.files[0]; 

     // Insert the image into the database 
     // getting the image ID for use in the course object 
     var imageObject = Images.insert(image); 

     // The image id is stored in the image object 
     var imageId = imageObject._id 

     // Create a reactive var to be used when the course is added 
     imageIdVar = new ReactiveVar(imageId); 

    }, 
    'change #attachment': function(evt, temp) { 
    /* FS.Utility.eachFile(event, function(file) { 
     Images.insert(file, function (err, fileObj) { 
     // Inserted new doc with ID fileObj._id, and kicked off the data upload using HTTP 
     if (err) throw err; 
     }); 
    }); */ 

     var attachment = event.target.files[0]; 

     // Insert the image into the database 
     // getting the image ID for use in the course object 
     var attachmentObject = Attachments.insert(attachment); 

     // The image id is stored in the image object 
     var attachmentId = attachmentObject._id 

     // Create a reactive var to be used when the course is added 
     attachmentIdVar = new ReactiveVar(attachmentId); 

    }, 
    'submit form': function (evt, temp) { 
     evt.preventDefault(); 
     NewsEvents.insert({ 
      title: $('#title').val(), 
      description: $('#description').val(), 
      type: $('input[name=netype]:checked').val(), 
      coverImageId: imageIdVar.get(), 
      attachmentId: attachmentIdVar.get(), 
      createdAt: new Date() 
     }); 

     $('#title').val(''); 
     $('#description').val(''); 
     $("input:radio").removeAttr("checked"); 

     console.log("done"); 
    } 
}); 

我想过使用if语句来检查,如果无功是truthy但这似乎累赘。

我使用下列程序包:

  • CFS:标准套餐

  • CFS:文件系统

  • 无功无功

  • dburles:收集,助手

任何帮助高度赞赏。

+0

尝试'console.log'在提交表单是否你的'imageIdVar'实际上是获得通过与否。 –

+0

@KawsarAhmed:只要有人上传文件,它就会被传递。插入工作完美无瑕。但上传图片是可选的。所以如果用户没有上传图片,整个文档将不会被插入:( –

回答

2

您所要做的就是在您的流星项目中安装underscoreJS。然后添加到数据库中检查这样

_.isUndefined(imageIdVar); 

在此之前返回布尔是否您imageIdVarattachmentIdVar有一些数据或没有。因此,如果您输入错误,您将跳过insert方法中的图像字段coverImageIdattachmentIdVar。由于MongDB是无模式的,所以如果没有这些字段,就不会出现问题。

一个更好的办法

var temp ={}; 
temp.title = $('#title').val(); 
// and for other variables also 
if(!_.inUndefined(imageIdVar.get())) { 
    temp.coverImageId = imageIdVar.get() 
} 
// you'll do also for attachment ID. then you'll insert the temp variable in the insert method 
NewsEvents.insert(temp); 
+0

因此,这意味着,我必须构建4个不同的场景?如果两个都定义了,我按照我的问题所示进行操作。另外三个插入函数:如果两个都没有定义(1),或者两个中只有一个被定义为(2)+(3).Hm ...没有任何“$存在”用于插入新条目? –

+1

是的,你可以这样做,或者考虑一个更好的解决方案,'$ exists'操作符用于你的db查询,而不是插入值 –

+0

我找不到更好的解决方案。 。我知道''exists'''只是查询语句,这就是为什么我想知道是否有'''$ exists''这样的值来插入值。 –

0

感谢@Faysal艾哈迈德,我想出了一个解决方案。你必须设置ReactiveVar假开头:

imageIdVar = new ReactiveVar(false); 
attachmentIdVar = new ReactiveVar(false); 

Template.adminNewsEvents.events({ 
    'change #coverImage': function(evt, temp) { 
     var image = event.target.files[0]; 
     var imageObject = Images.insert(image); 
     var imageId = imageObject._id 

     if (imageId) { 
      imageIdVar = new ReactiveVar(imageId); 
     } 
    }, 
    'change #attachment': function(evt, temp) { 
     var attachment = event.target.files[0]; 
     var attachmentObject = Attachments.insert(attachment); 
     var attachmentId = attachmentObject._id 

     if (attachmentId) { 
      attachmentIdVar = new ReactiveVar(attachmentId); 
     } 
    }, 
    'submit form': function (evt, temp) { 
     evt.preventDefault(); 

     var temp = {}; 
     temp.title = $('#title').val(); 
     temp.description = $('#description').val(); 
     temp.type = $('input[name=netype]:checked').val(); 
     temp.createdAt = new Date(); 

     if (imageIdVar.get()) { 
      temp.coverImageId = imageIdVar.get(); 
     } 

     if (attachmentIdVar.get()) { 
      temp.attachmentId = attachmentIdVar.get(); 
     } 

     NewsEvents.insert(temp); 
    } 
}); 
相关问题