Здравствуйте. Столкнулся с проблемой получения дополнительных данных.

Например, создал активность в мобильном приложении, указав контрагента. На карточке просмотра активности есть необходимость скрывать некоторые поля, в зависимости от типа контрагента. Но на карточку просмотра активности о контрагенте загрузилась минимальная информация в виде Id и Name, а мне необходимо ещё значение Type.

Пробовал решить двумя способами.

В первом добавил бизнес правило на событие загрузки записи и внутри метода обработчика сделал следующий вызов:

var modelName = "Account";
var model = Ext.ClassManager.get(modelName);
 
var queryConfig = Ext.create("Terrasoft.QueryConfig", {
    modelName: modelName,
    columns: ["Id", "Name", "Type"]
});
 
model.load(account.get("Id"), {
    queryConfig: queryConfig,
    success: function(record) {
     // ???
    },
    failure: function(record, operation) {
        // ???
    },
    scope: this
});

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

Ext.callback(callbackConfig.success, callbackConfig.scope, [true]);

Вторым способом заместил View и Controller и в Controller-классе в методе onLoadRecord попытался вызвать безрезультатно Account.Store.getById.

Хотя, при прочих равных в файле PharmaMobileActionScheduleVisit пакета PharmaMobile аналогичная строка с "волшебным" Store работает.

var type = ActivityType.Store.getById(Terrasoft.Configuration.ActivityTypes.Visit);

Может код из первого варинта поместить в замещенный onLoadRecord? Или есть другие варианты? Прошу помощи в решении задачи.

Нравится

1 комментарий

Отвечу сам на вопрос решением. Оно оказалось простым.

При добавлении custom-правила вызовом 

Terrasoft.sdk.Model.addBusinessRule

(функция executeFn), в месте возврата данных model.load (success) необходимо вставить Ext.callback. Полным решение выглядит примерно следующим образом:

var modelName = "Account";
var model = Ext.ClassManager.get(modelName);
 
var queryConfig = Ext.create("Terrasoft.QueryConfig", {
	modelName: modelName,
	columns: ["Id", "Name", "Type"]
});
 
var failureFn = function(exception) {
	Ext.callback(callbackConfig.failure, callbackConfig.scope, [exception]);
};
 
model.load(account.get("Id"), {
	queryConfig: queryConfig,
	success: function(rec) {
 
		var type = rec.get("Type");
 
		record.changeProperty("FIELD-NAME", {
			hidden: type === "TYPE-VALUE"
		});
 
		Ext.callback(callbackConfig.success, callbackConfig.scope, [true]);
	},
	failure: failureFn,
	scope: this
});

Также, для загрузки данных, вместо model.load можно использовать и другую функцию

Terrasoft.DataUtils.loadRecords

 

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