Forms 在Meteor中提交表单而不使用额外功能
我想在我的Meteor html模板中有一个表单,并在提交时将该数据插入我的MongoDB列表。我的问题是:Forms 在Meteor中提交表单而不使用额外功能,forms,meteor,onsubmit,Forms,Meteor,Onsubmit,我想在我的Meteor html模板中有一个表单,并在提交时将该数据插入我的MongoDB列表。我的问题是: 在不使用额外软件包的情况下,这是可能的吗?我可以添加一个HTML表单作为模板吗 提交活动是否适用于最新的Meteor 我已经读到我们可以使用提交按钮的点击事件:您能告诉我如何在DOM中查找输入元素的值吗?(不使用jQuery?) JQuery包含在meteor中&非常简单,为什么要避免它?使用js手动遍历dom相当长 您可以使用javascript以ajax风格提交表单: 因此,您可以
- 在不使用额外软件包的情况下,这是可能的吗?我可以添加一个HTML表单作为模板吗李>
- 提交活动是否适用于最新的Meteor
- 我已经读到我们可以使用提交按钮的点击事件:您能告诉我如何在DOM中查找输入元素的值吗?(不使用jQuery?)
// HTML
<form id="myform">
<input type="text" name="firstname"/>
<input type="text" name="lastname"/>
<input type="text" name="email"/>
<input type="submit" id="submit"/>
</form>
// Client JS
function submitme() {
form = {};
$.each($('#myform').serializeArray(), function() {
form[this.name] = this.value;
});
// Do validation on
// form = {
// firstname: 'first name',
// lastname: 'last name',
// email: 'email@email.com'
// }
MyCollection.insert(form, function(err) {
if(!err) {
alert("Submitted!");
$('#myform')[0].reset();
} else {
alert("Something is wrong");
console.log(err);
}
});
}
如果您讨厌jQuery&根本无法使用它
// HTML
<form id="myform">
<input id="firstname" type="text" name="firstname"/>
<input id="lastname" type="text" name="lastname"/>
<input id="email" type="text" name="email"/>
<input type="submit" id="submit"/>
</form>
// Client JS
function submitme() {
form = {
firstname: firstname.value,
lastname: lastname.value,
email: email.value
};
// Do validation on
// form = {
// firstname: 'first name',
// lastname: 'last name',
// email: 'email@email.com'
// }
MyCollection.insert(form, function(err) {
if (!err) {
alert("Submitted!");
// Empty field values
email.value = "";
firstname.value = "";
lastname.value = "";
} else {
alert("Something is wrong");
console.log(err);
}
});
}
//HTML
//客户端JS
函数submitme(){
表格={
firstname:firstname.value,
lastname:lastname.value,
电子邮件:email.value
};
//验证
//表格={
//名字:“名字”,
//姓氏:“姓氏”,
//电邮:'email@email.com'
// }
MyCollection.insert(表单、函数(err){
如果(!err){
警报(“已提交!”);
//空字段值
email.value=“”;
firstname.value=“”;
lastname.value=“”;
}否则{
警惕(“有什么不对劲”);
控制台日志(err);
}
});
}
仅供参考,在Meteor中有一种稍微干净的方式来创建表单,而不需要所有全局jQuery引用,我发现这很混乱。它通过限定事件处理程序中提供的模板的范围,使代码更不容易出错。下面是一个使用另一个答案中描述的形式的示例:
模板代码:
<template name="foo">
<form id="myform">
<input type="text" name="firstname"/>
<input type="text" name="lastname"/>
<input type="text" name="email"/>
<input type="submit" id="submit"/>
</form>
</template>
Template.foo.events({'submit form' : function(event, template) {
event.preventDefault();
firstname = template.find("input[name=firstname]");
lastname = template.find("input[name=lastname]");
email = template.find("input[name=email]");
// Do form validation
var data = {
firstname: firstname.value,
lastname: lastname.value,
email: email.value
};
email.value="";
firstname.value="";
lastname.value="";
MyCollection.insert(data, function(err) { /* handle error */ });
}});
最简单最简单的解决方案
// HTML
<template name="formTemplate">
<form>
<input type="text" name="firstname"/>
<input type="text" name="lastname"/>
<input type="submit" id="submit"/>
</form>
</template>
// JavaScript
Template.formTemplate.events({
'submit form': function(event, template) {
event.preventDefault(); // prevent page reload
var firstname = event.target.firstname.value;
var lastname = event.target.lastname.value;
}
});
//HTML
//JavaScript
Template.formTemplate.events({
“提交表单”:函数(事件、模板){
event.preventDefault();//防止重新加载页面
var firstname=event.target.firstname.value;
var lastname=event.target.lastname.value;
}
});
这并不能完全回答您的问题。但我会这么做的
Books=newmongo.Collection(“图书”);
书籍。附件(新单纯形)({
标题:{
类型:字符串,
标签:“标题”,
最多:200
},
作者:{
类型:字符串,
标签:“作者”
},
副本:{
类型:数字,
标签:“份数”,
最低:0
},
上次签出:{
类型:日期,
标签:“本书最后一次借出日期”,
可选:true
},
总结:{
类型:字符串,
标签:“简要摘要”,
可选:true,
最高:1000
}
}));代码>想要分享我的方式它非常简单:
html:
结果是整洁的对象{name:“…”,电子邮件:“…”}
如果您使用的是SimpleSchema
docheck(doc,Schemas.updateProfile)代码>通过服务器进行验证。如果我进行jQuery事件和jQuery DOM遍历,那么我应该进行jQuery,而不是meteor。。正确的?我的意思是,我想知道Meteor是否有高效的DOM遍历自己..我不会说Meteor是这样的javascript框架,它不是用来取代JQuery而是用来将所有东西放在一起的,它仍然是Meteor,通过延迟补偿将数据反应性地放入其中&JQuery遍历DOM。它可以立即插入,而jquery本身无法做到这一点。Meteor没有任何DOM遍历功能,Handlebar,模板系统,也是一个外部框架。如果模板中恰好只有一个表单,您可以使用submit
处理程序,而不是单击#submit
。另外,您可以执行$('#myform')[0].reset()
而不是手动重置所有表单元素。谢谢@DavidWeldon。我修改了代码以反映这一点。@GeorgeKatsanos我也修改了代码,因此也有一个纯javascript版本。根本没有jquery。当您有一个单选按钮时,如何执行选择器?是否是template.find('input:radio[name=“myNameForRadio”]:checked())?另外,使用Discover Meteor book,他们使用$(e.target).find('[name=firstname]').val();你能解释一下使用A)$(e.target)和B)模板之间的区别吗?我明白了。只是有不同的选择器,我想出来了。有不同的选择器$(e.target).find(“…”)使用.value属性,而template使用val()方法。你同意吗?(我是个新手,正在努力确保术语正确无误)。请注意,$(target)也不起作用。@这只是原始javascript选择器和jQuery提供的附加功能之间的区别。确保区分您使用的是哪一个。您也可以只从函数返回false,而不包括event.preventDefault()
。来自:“从处理程序返回false与在事件上同时调用stopImmediatePropagation和preventDefault是一样的。”我喜欢在常见情况下这样做。但我也使用currentTarget
来确保我处理的是实际的表单提交侦听器,而不是我所理解和理解的单击元素
// HTML
<template name="formTemplate">
<form>
<input type="text" name="firstname"/>
<input type="text" name="lastname"/>
<input type="submit" id="submit"/>
</form>
</template>
// JavaScript
Template.formTemplate.events({
'submit form': function(event, template) {
event.preventDefault(); // prevent page reload
var firstname = event.target.firstname.value;
var lastname = event.target.lastname.value;
}
});
<form id="update-profile">
<div class="form-group">
<input type="text" required class="form-control" name="name" placeholder="Full Name" value="{{profile.name}}">
</div>
...
Template.profileEditModal.events({
'submit form': function (e, t) {
e.preventDefault();
var doc = {};
t.$('input').each(function () {
if (this.value) {
doc[this.name] = this.value;
}
});
});