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

时间:2013-03-04 16:04:54

标签: forms meteor onsubmit

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

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

5 个答案:

答案 0 :(得分: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);
        }
    });

}

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

事件地图绑定:

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

如果您 HATE jQuery&amp;无法使用它

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

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

事件处理程序:

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

}});

答案 2 :(得分:7)

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

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

答案 3 :(得分:1)

想要分享我的方式,这很简单:

HTML:

<form id="update-profile">
  <div class="form-group">
    <input type="text" required class="form-control" name="name" placeholder="Full Name" value="{{profile.name}}">
  </div>
  ...

JS

Template.profileEditModal.events({
      'submit form': function (e, t) {
        e.preventDefault();
        var doc = {};

        t.$('input').each(function () {
          if (this.value) {
            doc[this.name] = this.value;
          }
        });
});

结果很干净Object {name: "...", email: "..."}

如果您正在使用SimpleSchemacheck(doc, Schemas.updateProfile);进行验证。

答案 4 :(得分:0)

这并不能完全回答你的问题。但这就是我要做的。

  1. meteor add aldeed:autoform

  2. 您已有的示例架构......

    Books = new Mongo.Collection("books");
    Books.attachSchema(new SimpleSchema({
      title: {
        type: String,
        label: "Title",
        max: 200
      },
      author: {
        type: String,
        label: "Author"
      },
      copies: {
        type: Number,
        label: "Number of copies",
        min: 0
      },
      lastCheckedOut: {
        type: Date,
        label: "Last date this book was checked out",
        optional: true
      },
      summary: {
        type: String,
        label: "Brief summary",
        optional: true,
        max: 1000
      }
    }));

  3. 3。 books.tpl.jade(来自mquandalle:jade)

    +quickForm collection="Books" id="insertBookForm" type="method" meteormethod="insertBook"
    

    4

    Meteor.methods({
      'insertBook': function (doc) {
          // server side validation, insert, error etc...
        }
    })

    通过这种方式,您可以免费获得免费的引导样式的客户端验证,如果需要,可以自定义字段可见性或样式。对于5分钟的开发,这是一个非常好的回报。 我会使用其他人花时间和思考的强大软件包,并在此基础上快速构建。