Подскажите как корректно загрузить пользовательский модуль с параметрами для конструктора объекта модуля.
Или иным образом передать в контекст загружаемого модуля данные ?
Пример модуля
function(Terrasoft, Ext, sandbox) {
Ext.define("Terrasoft.configuration.CardModuleResponseInterceptor", {
alternateClassName: "Terrasoft.CardModuleResponseInterceptor",
extend: "Terrasoft.BaseModule",
Ext: null,
sandbox: Ext.create(sandbox),
Terrasoft: null,
viewModel: null,
view: null,
rootScope: null,
subscribe: function() {
this.sandbox.subscribe(
"CardModuleResponse",
function(args) {
this.set("NewVar", args);
},
this.rootScope,
[this.rootScope.sandbox.id + "_AddTenderSuccessAction"]
);
}
});
return Terrasoft.CardModuleResponseInterceptor;
});
Как я только уже не пробовал:
//или
this.sandbox.loadModule("CardModuleResponseInterceptor", {instanceConfig:{rootScope: this}});
//или
this.sandbox.loadModule("CardModuleResponseInterceptor", {parameters:{rootScope: this}});
результата нет.
Не до конца ясен комментарий к parameters и instanceConfig
в core.js
Как это понять "инстанцированных модулях" ?
Какие модули "инстанцированные" а какие нет ?
Как сделать свой модуль соответвующим ?
Нравится
Вызов из страница контрагента:
callLicenseModule: function(arr) { var moduleId = this.sandbox.id + "_reasonsChooser"; this.modalBoxContainer = ModalBox.show({ minHeight: "1", minWidth: "1", maxHeight: "100", maxWidth: "100" }); ModalBox.setSize(650, 130); var chooseModuleConfig = { renderTo: this.modalBoxContainer, id: moduleId, parameters: { Collection: arr, Record: this.get("MasterRecordId") } }; this.sandbox.loadModule("TmLicenseModule", chooseModuleConfig); }
Модуль:
define("TmLicenseModule", ["BaseSchemaModuleV2"], function() { Ext.define("Terrasoft.configuration.TmLicenseModule", { extend: "Terrasoft.BaseSchemaModule", alternateClassName: "Terrasoft.TmLicenseModule", generateViewContainerId: false, initSchemaName: function() { this.schemaName = "TmLicenseModuleSchema"; }, initHistoryState: Ext.emptyFn, createViewModel: function() { var viewModel = this.callParent(arguments); var parameters = this.parameters; if (parameters) { viewModel.set("Licenses", parameters.Collection); viewModel.set("Record", parameters.Record); } return viewModel; } }); return Terrasoft.TmLicenseModule; });
Под модулем лежит страница TmLicenseModuleSchema, в ней 2 аттрибута (Licenses и Record). Соответственно они заполняются при вызове модуля
Добрый день, Илья.
Для передачи параметров в загружаемы модуль, необходимо воспользоваться свойством instanceConfig. Скорей всего проблема связана с тем, что в конструктор модуля можно передавать только литералы объектов. this же является уже созданным экземпляром класса.
В вашем варианте это модуль элемента граф.интерфейса, со вьюхой и т.д.
наследник "Terrasoft.BaseSchemaModule"
В моем же случае нет вьюх, у Вас не описан метод init, работа в котором требуется мне.
Да и в любом случае - я воспроизвел свой юзкейс наследуясь от Terrasoft.BaseSchemaModule
В init модуля все равно нет ничего ни через instanceConfig ни через parameters
loadModule должен по определению эти объекты транслировать в конструктор.
Но по какой-то причине этого не происходит в моем кейсе...
И вопрос здесь - почему ?
На вопрос "как?" примеров и в исходниках много... но не ясно почему там работает а в моем модуле, содранном структурно под копирку - не работает.
"Мотков Илья" написал: что в конструктор модуля можно передавать только литералы объектов. this же является уже созданным экземпляром класса.
т.е. теоретически должно помочь "оборачивание" this в массив или объект ?
this.sandbox.loadModule("CardModuleResponseInterceptor", {instanceConfig:{ rootScope: [this] }});
а в последствии получить к нему доступ по rootScope[0] внутри init метода
PS: Если "не секрет" с чем связанно ограничение на экземпляры класса в параметрах для конструктора - как то не ясна суть.
Скорей всего это архитектурное решение, ведь даже инстанс sandbox в загружаемом модуле инциализируется отдельно. Также можно кешировать scope в свойствах глобального объекта браузера.
"Мотков Илья" написал:Также можно кешировать scope в свойствах глобального объекта браузера.
Так это и решается сейчас, но это "костыль".
С враппингом пока не проверял... как проверю - отпишусь обязательно.