-
Notifications
You must be signed in to change notification settings - Fork 1
Carcas base
Страницы на сайте можно сгруппировать. Обычно этим пользуются серверные шаблонизаторы.
Например, в Twig'е
или в шаблонизаторе Django
с помощью наследования шаблонов обычно создаётся примерно такая структура:
index.html ----|
main.html--------
news.html ----| |
xhtml.html
users.html ----| |
admin.html------
roles.html ----|
На сайте есть основная часть и административная часть. Все страницы из одной части имеют набор одинаковых элементов. Одинаковая шапка, подвал, менюшка и всё такого рода. Явно, все эти элементы желательно прописывать не каждый раз в шаблоне каждой страницы, а один раз в шаблоне слоя.
Шаблоны же страниц содержат только уникальный для этих страниц контент.
На каждой странице могут быть какие-то виджеты, на которые наш код должен повесить некое поведение.
Логично, разбить этот код на части, соответствующие каждой странице, где требуется какое-то поведение.
Например, на странице новостей (шаблон news.html
из примера выше) есть пара виджетов.
Описываем их поведение в файле news.js
и подключаем на этой странице.
Точно также, как и с шаблонами в JS, логично, вынести общие части в отдельные файлы.
Например, на обычных страницах сайта (соответствующие слою main.html
) в шапке есть всплывающая форма авторизации.
Лучше создать main.js
и описать её поведение там, чем описывать в файле каждой странице.
В go.Carcas
поведение элементов на конкретных страницах описывается "контроллерами".
На странице "test" нам нужно сделать две вещи. Повесить на одно из текстовых полей всплывающий календарь (из jquery-ui, например). И сделать так, чтобы при нажатии на одну из ссылок отправлялась форма.
Пример определения контроллера для подобной страницы (с использованием jQuery):
go.Carcas.controller("test", ["layouts.main"], {
'CALENDAR_NODE': "#input-with-calendar",
'CALENDAR_PARAMS': {},
'LINK_NODE': "a#submit",
'FORM_NODE': "#form",
'init': function () {
$(this.CALENDAR_NODE).datapicker(this.CALENDAR_PARAMS);
$(this.LINK_NODE).click(this.onClickLink);
},
'onClickLink': function () {
$(this.FORM_NODE).submit();
}
});
Метод контроллера init()
будет вызван после загрузки DOM
.
Подробнее см. Контроллеры.
При определении контроллера мы указываем зависимость - layouts.main
.
test
, это контроллер страницы, он наследуется от контроллера слоя.
(см. Организация кода и Списки зависимостей).
Контроллеры можно разделить на следующие типы:
- Контроллеры страницы
- Контроллеры слоёв
- Блуждающие контроллеры. Соответствуют элементам, которые могут появляться на нескольких страницах, хотя не относятся к слою.
Это теоретическое разбиение.
С точки go.Carcas
просто есть контроллеры, каждый из которых может зависить от других контроллеров.
Кроме того, совершенно не обязательно, чтобы каждый контроллер соответствовал какой-либо странице или шаблону. Можно один контроллер использовать на нескольких страницах или на одной странице несколько контроллеров. Просто так удобнее и структурирование.
Виджетов у каждого контроллера может быть много, а их поведение может быть достаточно объёмным. Поэтому, если всё писать в одном файле, может получиться каша.
Кроме того, нас всю жизнь учили выделять общее поведение, не мешать модель с контроллером и использовать модульный подход.
Для выноса основного кода из контроллеров используются файлы именуемые "модулями".
По правильному должно быть так:
- Контроллер извлекает виджеты из страницы и передаёт их обработку модулям.
- Модуль занимается работой с полученными извне элементами. Сам он не должен знать, где на странице они расположены и с чем связаны.
См.также: Модули и Списки зависимостей.