Sandbox

Средний

Модуль — фрагмент кода, инкапсулированный в обособленный блок, который самостоятельно загружается и выполняется. Модуль не имеет информации об остальных модулях приложения, кроме имен модулей, от которых он зависит. Модули могут взаимодействовать между собой через сообщения. Чтобы организовать взаимодействие модулей, используйте объект sandbox.

Действия, которые которые позволяет выполнять объект sandbox:

  • Организовать обмен сообщениями между модулями.
  • Загрузить и выгрузить модули по запросу.

Важно. Чтобы модуль взаимодействовал с другими модулями приложения, укажите модуль sandbox в качестве зависимости.

Организовать обмен сообщениями между модулями 

Действия, которые необходимо выполнить для обмена сообщениями между модулями:

  • Зарегистрировать сообщение.
  • Опубликовать сообщение.
  • Подписаться на сообщение.

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

На заметку. Если модуль экспортирует конструктор класса, то указывать базовые модули ext-base, terrasoft, sandbox в зависимостях необязательно. Объекты Ext, Terrasoft и sandbox доступны как свойства объекта this.Ext, this.Terrasoft, this.sandbox.

Зарегистрировать сообщение 

Способы регистрации сообщения:

  • С помощью метода sandbox.registerMessages(messageConfig).
  • С помощью схемы модуля.

Зарегистрировать сообщение c помощью метода sandbox.registerMessages(messageConfig) 

Параметр messageConfig — конфигурационный объект сообщений модуля. Конфигурационный объект является коллекцией "ключ-значение".

Шаблон конфигурационного объекта сообщения
"MessageName": {
    mode: [Message mode],
    direction: [Message direction]
}
  • MessageName — ключ элемента коллекции, который содержит имя сообщения.
  • mode — режим работы сообщения. Содержит значение перечисления Terrasoft.core.enums.MessageMode. Перечисление MessageMode описано в Библиотеке JS классов.

    • Широковещательный — количество подписчиков на сообщение заранее неизвестно. Соответствует значению перечисления Terrasoft.MessageMode.BROADCAST.
    • Адресный — сообщение обрабатывается одним подписчиком. Соответствует значению перечисления Terrasoft.MessageMode.PTP. Подписчиков может быть несколько, но сообщение обработает только один, как правило, последний зарегистрированный подписчик.
  • direction — направление сообщения. Содержит значение перечисления Terrasoft.core.enums.MessageDirectionType. Перечисление MessageDirectionType описано в Библиотеке JS классов.

    • Публикация — модуль публикует сообщение в sandbox. Соответствует значению перечисления Terrasoft.MessageDirectionType.PUBLISH.
    • Подписка — модуль подписывается на сообщение, которое опубликовано из другого модуля. Соответствует значению перечисления Terrasoft.MessageDirectionType.SUBSCRIBE.
    • Двунаправленное — модуль публикует и подписывается на одно и то же сообщение в разных экземплярах одного и того же класса или в рамках одной и той же иерархии наследования схем. Соответствует значению перечисления Terrasoft.MessageDirectionType.BIDIRECTIONAL.

Чтобы отменить регистрацию сообщений в модуле, используйте метод sandbox.unRegisterMessages(messages), где messages — имя или массив имен сообщений.

Чтобы зарегистрировать сообщение в модели представления, объявите конфигурационный объект сообщений в свойстве messages схемы.

Зарегистрировать сообщение c помощью схемы модуля 

  1. Перейдите в раздел Конфигурация (Configuration) и откройте схему модуля.
  2. Добавьте сообщение в схему модуля.

    1. В контекстном меню узла Сообщения (Messages) нажмите кнопку scr_add_button.png.
    2. Заполните свойства сообщения.

      • Название (Name) — имя сообщения. Совпадает с ключом в конфигурационном объекте модуля.
      • Направление (Direction) — направление сообщения. Возможные значения:

        • Subscribe — подписка.
        • Publish — публикация.
      • Режим (Mode) — режим работы сообщения. Возможные значения:

        • Broadcast — широковещательное.
        • Address — адресное.
    3. Для добавления сообщения нажмите Добавить (Add).

Нет необходимости регистрировать сообщения в схеме модели представления.

Опубликовать сообщение 

Чтобы опубликовать сообщение, используйте метод sandbox.publish(messageName, messageArgs, tags).

Для сообщения, которое опубликовано с массивом тегов, вызываются обработчики, для которых совпадает хотя бы один тег. Сообщения, которые опубликованы без тегов, вызываются обработчики без тегов.

Подписаться на сообщение 

Чтобы подписаться на сообщение, используйте метод sandbox.subscribe(messageName, messageHandler, scope, tags).

Загрузить и выгрузить модули по запросу 

Creatio позволяет загрузить и выгрузить модули, которые не указаны в качестве зависимостей, при работе с пользовательским интерфейсом.

Загрузить модуль по запросу 

Чтобы загрузить модуль по запросу, используйте метод sandbox.loadModule(moduleName, config). Параметры метода:

  • moduleName — название модуля.
  • config — конфигурационный объект параметров модуля. Обязательный параметр для визуальных модулей.

Примеры вызова метода sandbox.loadModule() представлены ниже.

this.sandbox.loadModule("ProcessListenerV2");
this.sandbox.loadModule("CardModuleV2", {
    renderTo: "centerPanel",
    keepAlive: true,
    id: moduleId
});

Выгрузить модуль по запросу 

Чтобы выгрузить модуль по запросу, используйте метод sandbox.unloadModule(id, renderTo, keepAlive). Параметры метода:

  • id — идентификатор модуля.
  • renderTo — название контейнера, из которого необходимо удалить представление визуального модуля. Обязателен для визуальных модулей.
  • keepAlive — признак сохранения модели модуля. При выгрузке модуля ядро может сохранить модель для использования свойств, методов, сообщений. Не рекомендуется использовать.

Примеры вызова метода sandbox.unloadModule() представлены ниже.

/* Получает идентификатор выгружаемого модуля. */
getModuleId: function() {
    return this.sandbox.id + "_ModuleName";
},

/* Выгружает невизуальный модуль. */
this.sandbox.unloadModule(this.getModuleId());
/* Получает идентификатор выгружаемого модуля. */
getModuleId: function() {
    return this.sandbox.id + "_ModuleName";
},

/* Выгружает визуальный модуль, который ранее загружен в контейнер "ModuleContainer". */
this.sandbox.unloadModule(this.getModuleId(), "ModuleContainer");

Создать цепочку модулей 

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

Чтобы начать построение цепочки, добавьте свойство keepAlive в конфигурационный объект загружаемого модуля.

Смотрите также
Реализовать обмен сообщениями между модулями
Средний

Пример. Создать модуль UsrSomeModule. В модуле реализовать сообщения:

  • Адресное сообщение MessageToSubscribe с направлением Subscribe.
  • Широковещательное сообщение MessageToPublish с направлением Publish.

Подписаться на сообщение MessageToSubscribe, которое отправляет другой модуль. Отменить регистрацию сообщений.

1. Создать модуль 

  1. Перейдите в раздел Конфигурация (Configuration) и выберите пользовательский пакет, в который будет добавлена схема.
  2. На панели инструментов реестра раздела нажмите Добавить —> Модуль (Add —> Module).

  3. В дизайнере модуля заполните свойства схемы:

    • Код (Code) — "UsrSomeModule".
    • Заголовок (Title) — "SomeModule".

    Для применения заданных свойств нажмите Применить (Apply).

  4. В дизайнере модуля добавьте исходный код.

    UsrSomeModule
    /* Объявление модуля с именем UsrSomeModule. Модуль не имеет никаких зависимостей, поэтому в качестве второго параметра передается пустой массив. */
    define("UsrSomeModule", [], function() {
        Ext.define("Terrasoft.configuration.UsrSomeModule", {
            alternateClassName: "Terrasoft.UsrSomeModule",
            extend: "Terrasoft.BaseModule",
            Ext: null,
            sandbox: null,
            Terrasoft: null,
            
            init: function() {
                this.callParent(arguments);
            },
            destroy: function() {
                this.callParent(arguments);
            }
        });
        return Terrasoft.UsrSomeModule;
    });
    
  5. На панели инструментов дизайнера модуля нажмите Сохранить (Save).

2. Зарегистрировать сообщения 

  1. Объявите конфигурационные объекты сообщений в свойстве messages схемы.
  2. В метод init() добавьте вызов метода sandbox.registerMessages(), который регистрирует сообщения.
Регистрация сообщений модуля
...
/* Коллекция конфигурационных объектов сообщений. */
messages: {
    "MessageToSubscribe": {
        mode: Terrasoft.MessageMode.PTP,
        direction: Terrasoft.MessageDirectionType.SUBSCRIBE
    },
    "MessageToPublish": {
        mode: Terrasoft.MessageMode.BROADCAST,
        direction: Terrasoft.MessageDirectionType.PUBLISH
    }
},
...
init: function() {
    this.callParent(arguments);
    /* Регистрирует коллекцию сообщений. */
    this.sandbox.registerMessages(this.messages);
},
...

3. Опубликовать сообщение 

  1. В схеме модуля реализуйте метод processMessages().
  2. В методе processMessages() вызовите метод sandbox.publish(), который публикует сообщение MessageToPublish.
  3. В метод init() добавьте вызов метода processMessages().
Публикация сообщения модуля
...
init: function() {
    ...
    this.processMessages();
},
...
processMessages: function() {
    this.sandbox.publish("MessageToPublish", null, [this.sandbox.id]);
},
...

4. Подписаться на сообщение 

  1. В метод processMessages() добавьте вызов метода sandbox.subscribe(), который подписывается на сообщение MessageToSubscribe, которое отправляет другой модуль.
  2. В параметрах метода укажите метод-обработчик onMessageSubscribe() и добавьте его в исходный код модуля.
Подписка на сообщение другого модуля
...
processMessages: function() {
    this.sandbox.subscribe("MessageToSubscribe", this.onMessageSubscribe, this, ["resultTag"]);
    this.sandbox.publish("MessageToPublish", null, [this.sandbox.id]);
},
onMessageSubscribe: function(args) {
    console.log("'MessageToSubscribe' received");
    /* Изменяет параметр. */
    args.arg1 = 15;
    args.arg2 = "new arg2";
    /* Возвращает результат. */
    return args;
},
...

5. Отменить регистрацию сообщений 

Отмена регистрации сообщений
...
destroy: function() {
    if (this.messages) {
        var messages = this.Terrasoft.keys(this.messages);
        /* Отменяет регистрацию массива сообщений. */
        this.sandbox.unRegisterMessages(messages);
    }
    this.callParent(arguments);
}
...
Полный исходный код схемы страницы
Принимать результат от модуля-подписчика (адресное сообщение)
Средний

Пример. В модуле реализовать адресное сообщение MessageWithResult с направлением Publish, которое принимает результат от модуля-подписчика.

Пример реализации адресного сообщения MessageWithResult
...
/* Коллекция конфигурационных объектов сообщений. */
messages: {
    ...
    "MessageWithResult": {
        mode: Terrasoft.MessageMode.PTP,
        direction: Terrasoft.MessageDirectionType.PUBLISH
    }
}
...
processMessages: function() {
    ...
    /* Публикует сообщения и получает результат его обработки подписчиком. */
    var result = this.sandbox.publish("MessageWithResult", {arg1:5, arg2:"arg2"}, ["resultTag"]);
    /* Выводит результат в консоль браузера. */
    console.log(result);
}
...
Принимать результат от модуля-подписчика (широковещательное сообщение)
Средний

Пример. В модуле реализовать широковещательное сообщение MessageWithResultBroadcast с направлением Publish, которое принимает результат от модуля-подписчика.

Пример реализации широковещательного сообщения MessageWithResultBroadcast
...
/* Коллекция конфигурационных объектов сообщений. */
messages: {
    ...
    "MessageWithResult": {
        mode: Terrasoft.MessageMode.PTP,
        direction: Terrasoft.MessageDirectionType.PUBLISH
    }
}
...
processMessages: function() {
    ...
    var arg = {};
    /* Публикует сообщения и получает результат его обработки подписчиком. В методе-обработчике подписчика в объект добавлено свойство result, в которое записывает результат обработки. */
    this.sandbox.publish("MessageWithResultBroadcast", arg, ["resultTag"]);
    /* Выводит результат в консоль браузера. */
    console.log(arg.result);
}
...
Реализовать асинхронный обмен сообщениями
Средний

Пример. Реализовать асинхронный обмен сообщениями между модулями.

  1. В модуле, который публикует сообщение, укажите конфигурационный объект в качестве параметра функции-обработчика.
  2. В конфигурационный объект добавьте функцию обратного вызова (callback-функцию).

    Пример публикации сообщения и получения результата
    ...
    this.sandbox.publish("AsyncMessageResult",
    /* Конфигурационный объект, который указан в качестве параметра функции-обработчика. */
    {
        /* Функция обратного вызова. */
        callback: function(result) {
            this.Terrasoft.showInformation(result);
        },
        /* Контекст выполнения функции обратного вызова. */
        scope: this
    });
    ...
    
  3. В методе-обработчике модуля-подписчика при подписке на сообщение верните асинхронный результат. Используйте параметр callback-функции опубликованного сообщения.

    Пример подписки на сообщение
    ...
    this.sandbox.subscribe("AsyncMessageResult",
    /* Функция-обработчик сообщения. */
    function(config) {
        /* Обрабатывает входящий параметр. */
        var config = config || {};
        var callback = config.callback;
        var scope = config.scope || this;
        /* Подготавливает результирующее сообщение. */
        var result = "Message from callback function";
        /* Выполняет функцию обратного вызова. */
        if (callback) {
            callback.call(scope, result);
        }
    },
    /* Контекст выполнения функции-обработчика сообщения. */
     this);
    ...
    
Пример использования двунаправленных сообщений
Средний

В схеме BaseEntityPage пакета CrtNUI зарегистрировано сообщение CardModuleResponse. Схема BaseEntityPage — базовая схема модели представления страницы записи.

BaseEntityPage
define("BaseEntityPage", [...], function(...) {
    return {
        messages: {
            ...
            "CardModuleResponse": {
                "mode": this.Terrasoft.MessageMode.PTP,
                "direction": this.Terrasoft.MessageDirectionType.BIDIRECTIONAL
            },
            ...
        },
        ...
    };
});

Например, Creatio публикует сообщение после сохранения измененной записи. Эта функциональность реализована в дочерней схеме BasePageV2 пакета CrtNUI.

BasePageV2
define("BasePageV2", [..., "LookupQuickAddMixin", ...], function(...) {
    return {
        ...
        methods: {
            ...
            onSaved: function(response, config) {
                ...
                    this.sendSaveCardModuleResponse(response.success);
                ...
            },
            ...
            sendSaveCardModuleResponse: function(success) {
                var primaryColumnValue = this.getPrimaryColumnValue();
                var infoObject = {
                    action: this.get("Operation"),
                    success: success,
                    primaryColumnValue: primaryColumnValue,
                    uId: primaryColumnValue,
                    primaryDisplayColumnValue: this.get(this.primaryDisplayColumnName),
                    primaryDisplayColumnName: this.primaryDisplayColumnName,
                    isInChain: this.get("IsInChain")
                };
                return this.sandbox.publish("CardModuleResponse", infoObject, [this.sandbox.id]);
            },
            ...
        },
        ...
    };
});

Миксин LookupQuickAddMixin указан в схеме BasePageV2 в качестве зависимости. В миксине реализована подписка на сообщение CardModuleResponse. Читайте подробнее в статье Клиентская схема.

LookupQuickAddMixin
define("LookupQuickAddMixin", [...], function(...) {
    Ext.define("Terrasoft.configuration.mixins.LookupQuickAddMixin", {
        alternateClassName: "Terrasoft.LookupQuickAddMixin",
        ...
        /* Объявляет сообщение. */
        _defaultMessages: {
            "CardModuleResponse": {
                "mode": this.Terrasoft.MessageMode.PTP,
                "direction": this.Terrasoft.MessageDirectionType.BIDIRECTIONAL
            }
        },
        ...
        /* Регистрирует сообщение. */
        _registerMessages: function() {
            this.sandbox.registerMessages(this._defaultMessages);
        },
        ...
        /* Инициализирует экземпляр класса. */
        init: function(callback, scope) {
            ...
            this._registerMessages();
            ...
        },
        ...
        /* Выполняется после добавления новой записи в справочник. */
        onLookupChange: function(newValue, columnName) {
            ...
            /* Выполняется цепочка вызовов методов.
            В результате вызывается метод _subscribeNewEntityCardModuleResponse(). */
            ...
        },
        ...
        /* Метод, в котором выполняется подписка на сообщение "CardModuleResponse".
        В callback-функции выполняется установка в справочное поле значения, которое отправлено при публикации сообщения. */
        _subscribeNewEntityCardModuleResponse: function(columnName, config) {
            this.sandbox.subscribe("CardModuleResponse", function(createdObj) {
                var rows = this._getResponseRowsConfig(createdObj);
                this.onLookupResult({
                    columnName: columnName,
                    selectedRows: rows
                });
            }, this, [config.moduleId]);
        },
        ...
    });
    return Terrasoft.LookupQuickAddMixin;
});

Последовательность работы с двунаправленным сообщением при добавлении нового адреса на странице контакта:

  1. Модуль ContactAddressPageV2 загружается в цепочку модулей на деталь Адреса (Addresses).

    scr_add_address.png
  2. Oткрывается страница адреса контакта.

    scr_new_city.png

    Поскольку схема ContactAddressPageV2 наследует схемы BaseEntityPage и BasePageV2, то в ней уже зарегистрировано сообщение CardModuleResponse. Это сообщение также регистрируется в методе _registerMessages() миксина LookupQuickAddMixin при его инициализации в качестве модуля-зависимости BasePageV2.

  3. При добавлении нового значения в справочные поля страницы ContactAddressPageV2 (например, нового города) вызывается метод onLookupChange() миксина LookupQuickAddMixin.
  4. Модуль CityPageV2 загружается в цепочку модулей.
  5. В методе onLookupChange() вызывается метод _subscribeNewEntityCardModuleResponse(), в котором осуществляется подписка на сообщение CardModuleResponse.
  6. Открывается страница города (схема CityPageV2 пакета CrtUIv2).

    scr_city_page.png
  7. Поскольку схема CityPageV2 наследует схему BasePageV2, то после сохранения записи (кнопка Сохранить (Save)) выполняется метод onSaved() базовой схемы.
  8. Метод onSaved() вызывает метод sendSaveCardModuleResponse(), который публикует сообщение CardModuleResponse. При этом передается объект с необходимыми результатами сохранения.
  9. После публикации сообщения выполняется callback-функция подписчика (метод _subscribeNewEntityCardModuleResponse() миксина LookupQuickAddMixin), в которой обрабатываются результаты сохранения нового города в справочник.

Таким образом, публикация и подписка на двунаправленное сообщение выполнены в рамках одной иерархии наследования схем. В этой иерархии базовая схема BasePageV2 содержит всю необходимую функциональность.

Настроить загрузку модуля
Средний

Пример. Загрузите пользовательский визуальный модуль UsrCardModule в пользовательский модуль UsrModule.

1. Создать класс визуального модуля 

Создайте класс модуля UsrCardModule, который наследует базовый класс BaseSchemaModule. Класс должен быть инстанцируемым, то есть возвращать функцию-конструктор. В этом случае, при загрузке модуля извне вы можете передать в конструктор необходимые параметры.

UsrCardModule
/* Модуль, который возвращает экземпляр класса. */
define("UsrCardModule", [...], function(...) {
    Ext.define("Terrasoft.configuration.UsrCardModule", {
        /* Псевдоним класса. */
        alternateClassName: "Terrasoft.UsrCardModule",
        /* Родительский класс. */
        extend: "Terrasoft.BaseSchemaModule",
        /* Признак установки параметров схемы извне. */
        isSchemaConfigInitialized: false,
        /* Признак использования состояния истории при загрузке модуля. */
        useHistoryState: true,
        /* Название схемы отображаемой сущности. */
        schemaName: "",
        /* Признак использования режима совместного отображения с реестром раздела.
        Если указано значение false, то на странице отображается SectionModule. */
        isSeparateMode: true,
        /* Название схемы объекта. */
        entitySchemaName: "",
        /* Значение первичной колонки. */
        primaryColumnValue: Terrasoft.GUID_EMPTY,
        /* Режим работы страницы записи. */
        operation: ""
    });
    /* Возвращает экземпляр класса. */
    return Terrasoft.UsrCardModule;
}

2. Создать класс модуля, в который загружается визуальный модуль 

Создайте класс модуля UsrModule, который наследует класс BaseModel.

UsrModule
define("UsrModule", [...], function(...) {
    Ext.define("Terrasoft.configuration.UsrModule", {
        alternateClassName: "Terrasoft.UsrModule",
        extend: "Terrasoft.BaseModel",
        Ext: null,
        sandbox: null,
        Terrasoft: null,
    });
}

3. Загрузить модуль 

Вы можете передавать параметры в конструктор класса инстанцируемого модуля при загрузке модуля. Для этого:

  1. В классе модуля UsrModule создайте конфигурационный объект.
  2. В качестве свойств конфигурационного объекта укажите требуемые значения.
  3. Загрузите визуальный модуль UsrCardModule с помощью метода sandbox.loadModule().
  4. В метод sandbox.loadModule() добавьте свойство instanceConfig.
  5. В качестве значения свойства instanceConfig передайте конфигурационный объект, который содержит требуемые значения.
UsrModule
...
init: function() {
    this.callParent(arguments);
    /* Конфигурационный объект. Свойства объекта указываются в качестве параметров конструктора. */
    var configObj = {
        isSchemaConfigInitialized: true,
        useHistoryState: false,
        isSeparateMode: true,
        schemaName: "QueueItemEditPage",
        entitySchemaName: "QueueItem",
        operation: ConfigurationEnums.CardStateV2.EDIT,
        primaryColumnValue: "{3B58C589-28C1-4937-B681-2D40B312FBB6}"
    };

    /* Загружает модуль. */
    this.sandbox.loadModule("UsrCardModule", {
        renderTo: "DelayExecutionModuleContainer",
        id: this.getQueueItemEditModuleId(),
        keepAlive: true,
        /* Конфигурационный объект указывается в конструкторе модуля в качестве параметра. */
        instanceConfig: configObj
    }
});
...

Чтобы передать дополнительные параметры при загрузке модуля, используйте свойство parameters конфигурационного объекта. Предварительно реализуйте такое же свойство в классе модуля или в одном из родительских классов. Свойство parameters определено в базовом классе BaseModule. При создании экземпляра модуля свойство parameters модуля будет проинициализировано значениями, которые переданы в свойстве parameters конфигурационного объекта.

Объект sandbox
Средний

Объект sandbox — компонент ядра, который используется для организации взаимодействия модулей.

Действия, которые которые позволяет выполнять объект sandbox:

  • Организовать обмен сообщениями между модулями.
  • Загрузить и выгрузить модули по запросу.

Методы 

registerMessages(messageConfig)

Регистрирует сообщения модуля.

Параметры
{Object} messageConfig

Конфигурационный объект сообщений модуля. Конфигурационный объект является коллекцией "ключ-значение", в которой каждый элемент имеет вид, представленный ниже.

Элемент конфигурационного объекта
/* Ключ элемента коллекции. Ключом является имя сообщения. */
"MessageName": {
    /* Значение элемента коллекции. */
    mode: [Режим работы сообщения],
    direction: [Направление сообщения]
}
Свойства значений элемента коллекции
{Terrasoft.MessageMode} mode

Режим работы сообщения. Содержит значение перечисления Terrasoft.MessageMode (Terrasoft.core.enums.MessageMode).

Возможные значения (Terrasoft.MessageMode)
BROADCAST

Широковещательный режим работы сообщения, при котором количество подписчиков заранее неизвестно.

PTP

Адресный режим работы сообщения, при котором сообщение может обработать только один подписчик.

{Terrasoft.MessageDirectionType} direction

Направление сообщения. Cодержит значение перечисления Terrasoft.MessageDirectionType (Terrasoft.core.enums.MessageDirectionType).

Возможные значения (Terrasoft.MessageDirectionType)
PUBLISH

Направление сообщения — публикация. Модуль только публикует сообщение в sandbox.

SUBSCRIBE

Направление сообщения — подписка. Модуль только подписывается на сообщение, которое публикует другой модуль.

BIDIRECTIONAL

Направление сообщения — двунаправленное. Модуль публикует и подписывается на одно и то же сообщение в разных экземплярах одного и того же класса или в рамках одной и той же иерархии наследования схем.

unRegisterMessages(messages)

Отменяет регистрацию сообщений.

Параметры
{String|Array} messages Имя или массив имен сообщений.
publish(messageName, messageArgs, tags)

Публикует сообщение в sandbox.

Параметры
{String} messageName Строка, которая содержит имя сообщения (например, "MessageToSubscribe").
{Object} messageArgs Объект, который передается в качестве параметра в метод-обработчик сообщения в модуле-подписчике. Если в методе-обработчике нет входящих параметров, то параметру messageArgs необходимо присвоить значение null.
{Array} tags Массив тегов, который позволяет однозначно определить модуль, отправляющий сообщение. Как правило, используется значение [this.sandbox.id]. По массиву тегов sandbox определяет подписчиков и публикаторов сообщения.
Примеры использования
Примеры использования метода publish()
/* Публикует сообщение без параметров и тегов. */
this.sandbox.publish("MessageWithoutArgsAndTags");

/* Публикует сообщение без параметров для метода-обработчика. */
this.sandbox.publish("MessageWithoutArgs", null, [this.sandbox.id]);

/* Публикует сообщение с параметром для метода-обработчика.*/
this.sandbox.publish("MessageWithArgs", {arg1: 5, arg2: "arg2"}, ["moduleName"]);

/* Публикует сообщение с произвольным массивом тегов.*/
this.sandbox.publish("MessageWithCustomIds", null, ["moduleName","otherTag"]);
subscribe(messageName, messageHandler, scope, tags)

Подписывается на сообщение.

Параметры
{String} messageName Строка, которая содержит имя сообщения (например, "MessageToSubscribe").
{Function} messageHandler Метод-обработчик, который вызывается при получении сообщения. Это может быть анонимная функция или метод модуля. В определении метода можно указать параметр, значение которого необходимо передать при публикации сообщения с помощью метода sandbox.publish().
{Object} scope Контекст выполнения метода-обработчика messageHandler.
{Array} tags Массив тегов, который позволяет однозначно определить модуль, отправляющий сообщение. По массиву тегов sandbox определяет подписчиков и публикаторов сообщения.
Примеры использования
Примеры использования метода subscribe()
/* Подписывается на сообщение без параметров для метода-обработчика.
Метод-обработчик — анонимная функция. Контекст выполнения — текущий модуль.
Метод getsandboxid() возвращает тег, который совпадает с тегом опубликованного сообщения. */
this.sandbox.subscribe("MessageWithoutArgs", function(){console.log("Message without arguments")}, this, [this.getSandBoxId()]);

/* Подписывается на сообщение с параметром для метода-обработчика. */
this.sandbox.subscribe("MessageWithArgs", function(args){console.log(args)}, this, ["moduleName"]);

/* Подписываетсяна сообщение с произвольным тегом.
Используйте тег из массива тегов опубликованного сообщения.
Метод-обработчик myMsgHandler() необходимо реализовать отдельно. */
this.sandbox.subscribe("MessageWithCustomIds", this.myMsgHandler, this, ["otherTag"]);
loadModule(moduleName, config)

Загружает модуль.

Параметры
{String} moduleName Название модуля.
{Object} config

Конфигурационный объект, который содержит параметры модуля. Обязательный параметр для визуальных модулей.

Свойства конфигурационного объекта
{String} id

Идентификатор модуля. Если не указан, то сформируется автоматически.

{String} renderTo

Название контейнера, в котором отображается представление визуального модуля. Передается в качестве параметра метода render() загружаемого модуля. Обязательный параметр для визуальных модулей.

{Boolean} keepAlive

Признак добавления модуля в цепочку модулей. Используется для навигации между представлениями модулей в браузере.

{Boolean} isAsync

Признак асинхронной инициализации модуля.

{Object} instanceConfig

Предоставляет возможность передавать параметры в конструктор класса инстанцируемого модуля при его загрузке. Для этого укажите конфигурационный объект в качестве значения свойства instanceConfig. Инстанцируемый модуль — модуль, который возвращает функцию-конструктор.

Типы свойства, который можно передавать в экземпляр модуля:

  • string
  • boolean
  • number
  • date (значение будет скопировано)
  • object (только объекты-литералы)

Не допускается передавать экземпляры классов, наследники HTMLElement и т. д. в качестве значения свойства. Ограничение, которое необходимо учитывать при передаче параметров в конструктор модуля наследника класса BaseObject: Creatio не позволяет передавать параметр, который не описан в классе модуля или в одном из родительских классов.

{Object} parameters

Передает дополнительные параметры в модуль при его загрузке. Предварительно необходимо реализовать такое же свойство в классе модуля или в одном из родительских классов. Свойство parameters определено в базовом классе BaseModule. При создании экземпляра модуля свойство parameters модуля будет проинициализировано значениями, которые переданы в свойстве parameters конфигурационного объекта.

Примеры использования
Примеры использования метода loadModule()
/* Загружает модуль без дополнительных параметров. */
this.sandbox.loadModule("ProcessListenerV2");

/* Загружает модуль с дополнительными параметрами. */
this.sandbox.loadModule("CardModuleV2", {
    renderTo: "centerPanel",
    keepAlive: true,
    id: moduleId
});
unloadModule(id, renderTo, keepAlive)

Выгружает модуль.

Параметры
{String} id Идентификатор модуля.
{String} renderTo Название контейнера, из которого необходимо удалить представление визуального модуля. Обязательный параметр для визуальных модулей.
{Boolean} keepAlive Признак сохранения модели модуля. При выгрузке модуля ядро может сохранить его модель для возможности использовать ее свойств, методов, сообщений.
Примеры использования
Примеры использования метода unloadModule()
/* Получает идентификатор выгружаемого модуля. */
getModuleId: function() {
    return this.sandbox.id + "_ModuleName";
},

...
/* Выгружает невизуальный модуль. */
this.sandbox.unloadModule(this.getModuleId());

...
/* Выгружает визуальный модуль, который ранее загружен в контейнер "ModuleContainer". */
this.sandbox.unloadModule(this.getModuleId(), "ModuleContainer");