loadModule с параметрами конструктора, как ?

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

define("CardModuleResponseInterceptor", ["terrasoft", "ext-base", "sandbox", "BaseModule"],
        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", {rootScope: this});
//или
this.sandbox.loadModule("CardModuleResponseInterceptor", {instanceConfig:{rootScope: this}});
//или
this.sandbox.loadModule("CardModuleResponseInterceptor", {parameters:{rootScope: this}});

результата нет.

Не до конца ясен комментарий к parameters и instanceConfig
в core.js

Used only for instantiated modules

Как это понять "инстанцированных модулях" ?
Какие модули "инстанцированные" а какие нет ?
Как сделать свой модуль соответвующим ?

Нравится

6 комментариев

Вызов из страница контрагента:

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 в свойствах глобального объекта браузера.

Так это и решается сейчас, но это "костыль".
С враппингом пока не проверял... как проверю - отпишусь обязательно.

Показать все комментарии