Отправка формы в Meteor без использования дополнительных услуг
Я хотел бы иметь форму в моем шаблоне html для Meteor и отправлять эти данные в мой список MongoDB. Мои вопросы:
- Возможно ли это без использования дополнительных пакетов? Могу ли я просто добавить HTML-форму в качестве шаблона?
- Работает ли событие on submit для последнего Meteor?
- Я читал, что мы можем использовать событие click для кнопки submit: Не могли бы вы рассказать мне, как я буду искать в своих DOM значения моих входных элементов? (без использования jQuery?)
Ответы
Ответ 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
}
}));