我想将用户的URL存储到数据库中。到目前为止,我已在客户端创建了Session
变量并将值存储在那里,然后使用Meteor方法将它们传递给服务器。
这些是执行此操作的方法
screenshotsURLS: function (sshots) {
check(sshots, [String]);
// Products.update({},{$set:{screenShots:sshots}});
scs = sshots.slice();
console.log(scs);
},
previewImageUrl: function (url) {
check(url, String);
pi = url;
console.log(pi);
},
sourceCodeUrl: function (url) {
check(url, String);
zip = url;
console.log(zip);
}
这三个变量“scs,pi,zip”初始化如下:
var zip;
var pi;
var scs = [];
我的代码工作正常,我设法将变量的值存储在我的集合中,问题是当我从两个浏览器打开网站并调用其中的函数时。上面的变量将具有调用该函数的最后一个的值。
他们是这样的集合中的商店:
submitPost: function (app) {
// Console.log('new App:', app);
check(app, {
title: String,
description: String,
category: String,
price: Number
});
var knownId = Products.insert(app);
Products.update({ _id: knownId }, { $set:{previewImage: pi, sourceCode: zip }});
}
并且scs使用autoValue返回值
screenShots: {
type: [String],
autoValue: function() {
return scs;
}
}
对于submitPost,它是以这种方式从html文件中的quickForm调用的
{{> quickForm collection="Products" id="submitPostForm"
type="method" meteormethod="submitPost" omitFields="createdAt, previewImage, screenShots, sourceCode, userID"}}
用户点击提交按钮后,将触发submitPost。
AutoForm.hooks实现
AutoForm.hooks({
submitPostForm: { //<--- this is the id of your form
before: { //<-- before submit
methodName: function (doc) { //<-- get the doc to be submitted
//HERE YOU CAN MANIPULATE THE FORM FIELDS BEFORE SUBMIT
var previewImage = Session.get("previewImageURL")
if (previewImage) {
doc.previewImage = previewImage;
}
var sourceCode = Session.get("sourceCodeURL");
if (sourceCode) {
doc.sourceCode = sourceCode;
}
var screenshots = Session.get("screenshots");
if (screenshots) {
doc.screenShots = screenshots;
}
return doc;
}
},
onSuccess: function (formType, result) {
},
onError: function (formType, error) {
}
}
});
我相信我的AutoForm.hooks由于某些原因不起作用,因为当我尝试console.log(“previewImage”)时没有任何反应!
如何为每个用户分隔变量“scs,pi,zip”以使它们不矛盾?
答案 0 :(得分:1)
在我看来,你无缘无故地使事情变得复杂:
如果数据是由用户提交的(即预览图片网址或代码网址),那么您应该在提交表单中一次提交所有内容。
如果以某种方式生成数据(如果您上传图像,然后需要获取该图像的url以在预览中显示)然后上传,并返回图像url是上传返回回调,以使其可用到你的形式。
当您提交表单时,请立即使用从服务器生成的信息提交所有内容并将其发送回客户端。
所以无论你在方法调用上做什么,只需使用return pi;
或return url;
或者你需要从该调用返回的任何内容,返回方法回调中的id。
修改强>
似乎问题与将额外的参数传递给表单有关。
这是使用表格挂钩完成的:
{{> quickForm
collection="Product"
id="create"
type="method"
meteormethod="insertProduct"
doc=doc
}}
AutoForm.hooks({
create: { //<--- this is the id of your form
before: { //<-- before submit
method: function (doc) { //<-- get the doc to be submitted
//HERE YOU CAN MANIPULATE THE FORM FIELDS BEFORE SUBMIT
var image = Session.get('imagePreview');
if (image) {
doc['preview'] = image;
}
return doc;
}
},
onSuccess: function (formType, result) {
},
onError: function (formType, error) {
}
}
});