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

go.Carcas: модули

Пример модуля:

go.Carcas.module("admin.ui.List", null, function (carcas) {

    return go.Class(go.Ext.Nodes, {
    
        'nodes': {
            'header' : "tr.head",
            'lines'  : "tr.line",
            'footer' : "tr.footer"
        },
    
        '__construct': function (node) {
            this.initNodes(node);
            this.initEvents();
        },
        
        'initEvents': function () {
            // ...
        }
    
    });

});

В админке сайта есть некие списки объектов. У всех у них есть стандартное поведение (например, можно сортировать строчки, фильтровать). Это поведение описывается этим модулем.

go.Carcas.module(name, [deps ,] CModule)

Определение модуля происходит через статический метод go.Carcas.module() (являющийся алиасом для go.Carcas.getInstance().module()).

Метод получает следующие аргументы:

name - имя модуля. В примере, это admin.ui.List, соответственно, лежать модуль должен в файле {root}/modules/admin/ui/List.js.

deps (mixed) - список зависимостей модуля. Необязательный аргумент. Формат подробно описан в соответствующем разделе. В примере указано null - модуль ничего не требует для своей работы.

CModule - функция-конструктор модуля. См. ниже.

Конструктор модуля

Объект модуля создаётся путём вызова конструктора CModule. Создание модуля происходит после того, как будут подгружены все зависимости.

Что вернёт функция-конструктор, то и будет считаться модулем.

В примере модуль создаётся в виде класса. Можно создать объект-namespace с набором функций. Или просто функцию. На что хватит фантазии.

Объект carcas

Единственным аргументом конструктор модуля получает центральный объект каркаса.

С его помощью можно обращаться к другим модулям и реестру.

Модули vs контроллеры

Модули желательно разрабатывать обобщённо. Модуль в примере не должен знать, сколько списков на странице и где они расположены. Он должен работать с данными, полученными от контроллеров и других модулей.

Пример контроллера, использующего вышеприведённый модуль:

go.Carcas.controller("layouts.admin", ["mo:admin.ui.List"], {

    'nodes': {
        'lists': ".admin-list"
        // ...
    },

    'init': function () {
        this.initLists();
        // ...
    },
    
    'initLists': function () {
        var nodes = this.nodes.lists,
            len = nodes.length,
            i,
            node,
            lists = [],
            ListClass = this.carcas.mo.admin.ui.List,
            list;
        for (i = 0; i < len; i += 1) {
            node = nodes.eq(i);
            list = new ListClass(node);
            lists.push(list);
        }
        this.lists = lists;
    },

    // ...
});

Контроллер административного слоя среди прочих своих занятий извлекает со страницы все списки (таблицы с классом "admin-list") и для каждого создаёт объект класса определённого в модуле. На всякий случай список этих объектов сохраняется в this.lists. Код модуля занимается отдельным списком и не задумывается о том, сколько этих списков на странице.

Clone this wiki locally