Сейчас стало модно использовать Full-stack javascript framework'и и я тоже решил понять, что это такое. Под катом я попытаюсь обяснить как реализовать роутинг при работе с Meteor.js.
Как настраивать Meteor, да и вообще что это такое и зачем нужно, я рассказывать не буду, так как сегодня за меня это сделал товарищ cryptograf, за что ему спасибо.
Meteor.js и роутинг
Все мы прекрасно понимаю что делая более-менее крупные single-page проекты, нам необходим роутинг. Meteor нативного при себе не имеет, но спасибо сторонним разработчикам. В данной статье мы рассмотрим iron-router.
iron-router
Установить данное чудо можно как и многие другие пакеты через atmosphere:
mrt add iron-router
А теперь давайте разбираться. Создание маршрутов очень просто:
Router.map(function () {
this.route('index', { // создается маршрут к /, который будет рендерить шаблон index
path: '/'
});
this.route('login'); // создается маршрут к /login, который будет рендерить шаблон login
});
Так же мы можем указывать определённый шаблон параметром template, принимать переменные через path и отдавать данные в шаблон с помощь data:
this.route('post', {
template: 'posts',
path: '/posts/:_id',
data: {
lists: todoLists.find()
}
}
Подробнее можно почитать здесь.
В общих чертах с созданием маршрутов мы разобрались. Теперь интересная штука, iron-router по умолчанию рендерить шаблоны в конец body, но например мне это не нравится. Исправить данный грех библиотеки можно легко:
Router.configure({
autoRender: false
});
И в нужном месте нашего html вставляем {{renderRouter}}
<body>
{{> header}}
<div class="container">
{{renderRouter}}
</div>
</body>
Применение полученных знаний
Давайте реализуем ToDo с различными списками!
Создаём шаблоны:
<body>
{{> header}}
<div>
{{renderRouter}}
</div>
</body>
<template name="header">
<div><h2>ToDo<h2></div>
</template>
<template name="todoLists">
<ul>
{{#each lists}}
{{> todoListsElement}}
{{/each}}
</ul>
</template>
<template name="todoList">
<h4>{{todo.name}}</h4>
<ul>
{{#each elements}}
{{> todoListElement}}
{{/each}}
</ul>
</template>
<template name="todoListElement">
<li>{{name}}</li>
</template>
<template name="todoListsElement">
<li><a href="{{pathFor 'todoList'}}">{{name}}</a></li>
</template>
<template name="404">404</template>
Настраиваем роутинг:
Router.configure({
autoRender: false,
notFoundTemplate: '404'
});
Router.map(function () {
this.route('todoLists', {
path: '/',
data: {
lists: todoLists.find()
}
});
this.route('todoList', {
path: '/todo/:_id',
data: function() {
return {
todo: todoLists.findOne({_id: this.params._id}),
elements: todoListElements.find({todo_id: this.params._id})
}
}
});
});
И конечно же коллекции:
todoLists = new Meteor.Collection("TodoLists");
todoListElements = new Meteor.Collection("TodoListElements");
Теперь запускаем проект и идёт проверять.
Чтобы добавить новый список используем консоль бразуера:
todoLists.insert({name: 'My ToDo List'});
В консоль вернётся ID, он нам нужен чтобы добавить элемент в список:
todoListElements.insert({todo_id: "vEnWrM2GPNYjt5kkL", name: "My first element in ToDo"});
Исходники можно найти тут.
Надеюсь что моя первая статья Вам понравилась и я буду писать ещё, так как есть много не затронутых тем про Meteor.js.