在Meteor中提交表单而不使用额外内容

Geo*_*nos 12 forms onsubmit meteor

我想在我的Meteor html模板中有一个表单,并在提交时将该数据插入我的MongoDB列表.我的问题是:

  • 这可能不使用额外的包吗?我可以只添加一个HTML表单作为模板吗?
  • on submit事件是否适用于最新的Meteor?
  • 我已经读过,我们可以使用click事件作为提交按钮:你能告诉我如何在DOM中查找输入元素的值吗?(不使用jQuery?)

Aks*_*hat 16

JQuery包含在流星中并且非常简化,为什么要避免它?用js手动遍历dom很长

您可以使用javascript提交表单ajax样式:

所以你可以像往常一样在你的模板中使用普通的表单html:

// 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);
        }
    });

}
Run Code Online (Sandbox Code Playgroud)

您可以绑定选择按钮以在单击时插入数据:

事件地图绑定:

Template.templatename.events({
    'submit' : function(event) {
        event.preventDefault(); //prevent page refresh
        submitme();
    }
});
Run Code Online (Sandbox Code Playgroud)

如果你讨厌 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);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)


And*_*Mao 11

仅供参考,有一种稍微更简洁的方法在没有所有全局jQuery引用的情况下在Meteor中执行表单,我觉得这些引用很混乱.它通过作用于事件处理程序中提供的模板使代码更容易出错.以下是使用其他答案中描述的表单的示例:

模板代码:

<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>
Run Code Online (Sandbox Code Playgroud)

事件处理程序

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 */ });

}});
Run Code Online (Sandbox Code Playgroud)


avi*_*ung 8

最简单,最简单的解决方案.

// 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; 
    }
});
Run Code Online (Sandbox Code Playgroud)