Вызов метеорных методов в компонентах React
В настоящее время я работаю над проектом, основанным на Meteor в качестве бэк-энда и React в качестве бэк-энда. Я действительно наслаждался простотой, пока я не удалил insecure
пакет и приходится иметь дело с метеорными методами. Сейчас мне нужно выполнить базовую операцию вставки, и я просто застрял! У меня есть форма как компонент (на случай, если в конце концов я бы хотел использовать эту форму не только для вставки элементов, но и для редактирования этих элементов), и вот мой код для этой формы:
AddItemForm = React.createClass({
propTypes: {
submitAction: React.PropTypes.func.isRequired
},
getDefaultProps() {
return {
submitButtonLabel: "Add Item"
};
},
render() {
return (
<div className="row">
<form onSubmit={this.submitAction} className="col s12">
<div className="row">
<div className="input-field col s6">
<input
id="name"
placeholder="What"
type="text"
/>
</div>
<div className="input-field col s6">
<input
placeholder="Amount"
id="amount"
type="text"
/>
</div>
</div>
<div className="row">
<div className="input-field col s12">
<textarea
placeholder="Description"
id="description"
className="materialize-textarea">
</textarea>
</div>
</div>
<div className="row center">
<button className="btn waves-effect waves-light" type="submit">{this.props.submitButtonLabel}</button>
</div>
</form>
</div>
);
}
});
Этот кусок кода используется в качестве компонента формы, у меня есть опора submitAction
который я использую, скажем, добавить вид:
AddItem = React.createClass({
handleSubmit(event) {
event.preventDefault();
const
name = $('#name').val(),
amount = $('#amount').val(),
description = $('#description').val();
Items.insert(
{
name: name,
range: range,
description: description,
createdAt: new Date(),
ownerId: Meteor.userId()
},
function(error) {
if (error) {
console.log("error");
} else {
FlowRouter.go('items');
};
}
);
},
render() {
return (
<div className="row">
<h1 className="center">Add Item</h1>
<AddItemForm
submitButtonLabel="Add Event"
submitAction={this.handleSubmit}
/>
</div>
);
}
});
Как видите, я напрямую получаю значения по идентификаторам, а затем выполняю insert
операция, которая работает абсолютно правильно, я даже могу отобразить эти данные. Так что теперь я должен удалить insecure
упаковать и перестроить весь стек операций, используя methods
где я на самом деле застрял. Как я понимаю, все, что я должен сделать, это получить те же данные и после этого выполнить Meteor.call
, но я не знаю, как правильно передать эти данные в текущий вызов метода. Я попытался рассмотреть эти данные прямо в теле метода, который не работает (я использовал тот же const
установить как в AddItem
Посмотреть). Поправьте меня, если я ошибаюсь, но я не думаю, что этот метод что-то знает о том, где я взял данные (или, может быть, я действительно не получаю рабочий процесс метода Метеора), поэтому к этому моменту я получил этот код как мой метод вставки:
Meteor.methods({
addItem() {
Items.insert({
name: name,
amount: amount,
description: description,
createdAt: new Date(),
ownerId: Meteor.userId()
});
}
});
и вот как я изменил свой handleSubmit
функция:
handleSubmit(event) {
event.preventDefault();
const
name = $('#name').val(),
amount = $('#amount').val(),
description = $('#description').val();
Meteor.call('addItem');
},
Также я попытался объявить метод следующим образом:
'addItem': function() {
Items.insert({
// same code
});
}
но это также не сработало для меня. Опять же, насколько я понимаю, проблема не в самих данных, как я писал до того, как они работают insecure
Пакет, проблема в том, как, черт возьми, я должен сначала получить эти данные на сервере и сразу после этого передать их клиенту с помощью методов (также консоль не выдает даже предупреждения и сразу после отправки формы страница перезагружается)? Я уже видел некоторые учебники и статьи в Интернете и не нашел решения, надеюсь получить помощь здесь.
1 ответ
Вы можете добавить свои данные в качестве параметров в функцию вызова Meteor. Вы также можете добавить функцию обратного вызова, чтобы проверить успешность вызова.
handleSubmit(event) {
event.preventDefault();
const
name = $('#name').val(),
amount = $('#amount').val(),
description = $('#description').val();
Meteor.call('addItem', name, amount, description, function(err, res) {
if (err){
console.log(JSON.stringify(err,null,2))
}else{
console.log(res, "success!")
}
});
},
В ваших метеорных методах:
Meteor.methods({
addItem(name, amount, description) {
var Added = Items.insert({
name: name,
amount: amount,
description: description,
createdAt: new Date(),
ownerId: Meteor.userId()
});
return Added
}
});