Skip to content
Grigoriev Oleg edited this page Mar 7, 2013 · 3 revisions

go.Carcas: основные понятия

Структура сайта

Страницы на сайте можно сгруппировать. Обычно этим пользуются серверные шаблонизаторы.

Например, в 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 просто есть контроллеры, каждый из которых может зависить от других контроллеров.

Кроме того, совершенно не обязательно, чтобы каждый контроллер соответствовал какой-либо странице или шаблону. Можно один контроллер использовать на нескольких страницах или на одной странице несколько контроллеров. Просто так удобнее и структурирование.

Модули

Виджетов у каждого контроллера может быть много, а их поведение может быть достаточно объёмным. Поэтому, если всё писать в одном файле, может получиться каша.

Кроме того, нас всю жизнь учили выделять общее поведение, не мешать модель с контроллером и использовать модульный подход.

Для выноса основного кода из контроллеров используются файлы именуемые "модулями".

По правильному должно быть так:

  1. Контроллер извлекает виджеты из страницы и передаёт их обработку модулям.
  2. Модуль занимается работой с полученными извне элементами. Сам он не должен знать, где на странице они расположены и с чем связаны.

См.также: Модули и Списки зависимостей.

Clone this wiki locally