Подтвердить что ты не робот

Отправка формы в Meteor без использования дополнительных услуг

Я хотел бы иметь форму в моем шаблоне html для Meteor и отправлять эти данные в мой список MongoDB. Мои вопросы:

  • Возможно ли это без использования дополнительных пакетов? Могу ли я просто добавить HTML-форму в качестве шаблона?
  • Работает ли событие on submit для последнего Meteor?
  • Я читал, что мы можем использовать событие click для кнопки submit: Не могли бы вы рассказать мне, как я буду искать в своих DOM значения моих входных элементов? (без использования jQuery?)
4b9b3361

Ответ 1

JQuery включен в метеор и очень упрощает, почему вы хотите его избежать? Его довольно долгое перемещение dom вручную с помощью js

Вы можете использовать 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 protected]'
    // }

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

Если вы ненавидите 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 protected]'
    // }

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

Ответ 2

Просто для справки, есть несколько более чистый способ делать формы в 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 */ });

}});

Ответ 3

Самое простое и простое решение для всех.

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

Ответ 4

Хотелось поделиться своим путём просто:

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: "..."}

И если вы используете SimpleSchema do check(doc, Schemas.updateProfile); поверх сервера для проверки.

Ответ 5

Это точно не отвечает на ваш вопрос. Но вот как я это сделаю.

  • Метеор добавить aldeed: autoform

  • Пример схемы, который у вас уже есть...

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