Каждый раз, когда у меня появляется новая идея для приложения, я начинаю с Meteor. И каждый раз, когда я в конечном итоге использую что-то другое. И я думаю, это сводится к тому, что я не знаю, как сделать простой запрос к базе данных.
Вот гипотетический пример. Я хочу создать приложение, в котором пользователь вводит что-то в поле, нажимает кнопку, а затем появляется изображение того, что они набрали. Он использует некоторый поиск изображений api.
<template name="image">
<input type="text" class="description"></input>
<button class="showImage"></button>
<img src="{{img}}"></img>
</template>
До сих пор кажется достаточно простым. Теперь нет способа отправить информацию клиенту, не помещая его сначала в базу данных, как я понимаю. Предположим, что мы имеем некоторую функцию addToDB, которая принимает запросы и вводит информацию об изображении в базу данных.
Template.image.events({
'click .showImage': function() {
addToDB($('.description').val());
}
});
Большой! Это все еще не так уж плохо. Но теперь, чтобы отправить данные обратно клиенту...
//server.js
Meteor.publish("image", function(query) {
Images.find({q: query});
}
Но ждать. Мы не можем просто подписаться, когда клиент загружается, потому что мы еще не знаем запрос. Поэтому, возможно, обработчик событий должен быть
Template.image.events({
'click .showImage': function() {
addToDB($('.description').val());
Deps.autorun(function() {
Meteor.subscribe("images", $('.description').val());
});
}
});
Хорошо, позвольте прокормить это в шаблон...
Template.image.img = function() {
return Images.findOne().imgsrc;
}
Нет, это приводит к ошибке, потому что, когда шаблон загружен первым, мы еще не подписались на "Изображения". Поэтому мы можем обновить шаблон следующим образом:
<template name="image">
<input type="text" class="description"></input>
<button class="showImage"></button>
{{#each info}}
<img src="{{info.img}}"></img>
{{/each}}
</template>
Затем измените функцию заполнения шаблона так:
Template.image.info = function() {
return Images.find({}, {limit: 1});
}
И вуаля!
Я потратил дольше, чем я готов признать, что сегодня вечером обрушился на все это. Если бы это был просто старый узел, я мог бы использовать простой jQuery.
Но есть миллион удивительных особенностей, которые Meteor имеет, что я действительно хочу использовать. Так что я надеюсь, что кто-то может показать мне дорогу. Какие ошибки я сделал в этом процессе и в конечном итоге? Какой самый красивый, самый чистый, самый простой способ сделать это в приложении метеорита.
Это настолько сложно, в рамках, что делает так много других вещей настолько простыми. Итак, как я могу просто сделать простой запрос к базе данных?
Рассмотрим глядя на примеры метеорных они обеспечивают. Все примеры имеют функциональные возможности ввода пользовательского ввода, управления коллекциями и отображения запросов коллекции к шаблонам.
Большая часть вашего кода выглядит хорошо, но вы задаете сразу несколько вопросов и начинаете с перспективы, которая затрудняет ответ. Некоторые общие замечания:
null.someThingIWant
- ошибка. Удобный шаблон return something && something.someThingIWant;
Одна из проблем в приведенном выше коде заключается в том, что ваша публикация не возвращает результаты запроса. Я предполагаю, что это опечатка.