Добрый день.

Заместил схемку LeadAccountProfileSchema - вызываю метод FindSimilar при получение сообщения от карточки лида. В методе реализован Terrasoft.chain, чтобы убрать ассинхронность запроса в initSimilarEntityRecordsCollection. Но в chain почему-отрабатывает только первая функция, а onSimilarButtonClick не работает. Почему?

 

 

 

define("LeadAccountProfileSchema", ["LeadAccountProfileSchemaResources", "LeadSimilarEntitiesProfileSchemaUtilities"],
	function(resources) {
		return {
			entitySchemaName: "Account",
			mixins: {},
			attributes: {},
			messages: {
			"FindSimilarAccount": {
			mode: this.Terrasoft.MessageMode.PTP,
			direction: this.Terrasoft.MessageDirectionType.SUBSCRIBE
			}
			},
			methods: {
				initEntity: function() {
					this.callParent(arguments);
					this.sandbox.subscribe("FindSimilarAccount", this.FindSimilar, this, ["123"]);
				},
				FindSimilar: function() {
					this.Terrasoft.chain(
					this.initSimilarEntityRecordsCollection,
					this.onSimilarButtonClick,
					this)
				}
			},
			};
	});

 

Нравится

4 комментария

Метод, находящийся в chain должен принимать и вызывать после выполнения логики callback:

 

initSimilarEntityRecordsCollection: function(callback, scope) {
    // Logic
	if (callback) {
		callback.call(scope || this);
	}
},

 

Толмачев Дмитрий Юрьевич,

Пробовал, но в этом случае опять же ассинхронность в initSimilarEntityRecordsCollection остаётся и следующая функция в chain запускается вне зависимости от работы первой функции.

СД,

попробуйте примерно вот так через next:

Terrasoft.chain(
	function (next) {
		// какие-то действия
		next();
	},
	function(next) {
		// либо в callback
		var config = {
			isSilent: true,
			callback: next
		};
		this.save(config, false);
	}
}

 

СД,

Это просто пример. Вы же спросили почему у вас не выполняет вторая функция. Не выполняется, т.к. не вызывается. Вызвать можно через callback или next.

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

  

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

Карточки в типовой конфигурации, если какрточка сущности была открыта в chain
(или поправьте меня как это правильно называть, мое толкование проистекает от метода openCardInChain)
В таком режиме - определенные типовые действия: "Закрыть", "Сохранить", "Отмена", приводят к "шагу назад" в цепочке открытых карточек.
Иногда в бизнес-логике необходимо выполнить принудительное сохранение карточки, для этого очень удобно использовать методы распостраняемые BasePageV2, и расширяемые на уровне сущностей в соответствии с их особенностями, в частности this.save()
Вопрос:
Можно ли принудительно изменить, в данном случае "прервать" поведение которое осуществляет закрытие карточки и возврат к предыдущей карточке в chain, после вызова this.save() ?

Нравится

3 комментария

Сам спросил, сам ответил

var config = {
    isSilent: true,
};
this.save(config)

метод принимает конфигурационный объект, в котором предусмотрен соответствующий флаг.
isSilent

так... сей фокус не работает если это целевой режим создания или копирования. (т.е. если это карточка новой записи - она все равно закрывается)

Вообщем итоговый "трюк" таков.
Если вам нужно вызвать this.save() и избежать закрытия карточки:

if (this.isAddMode() || this.isCopyMode()) {
	//сохраняем значения для восстановления их далее
	var operation = this.get("Operation");
	var isChain = this.get("IsInChain");
	//подменим целевой режим
	this.set("Operation", "edit");
	//подменим флаг присутствия в chain, елси он установлен
	if (isChain) {
		this.set("Operation", false);
	}
	//вызываем метод save, используем флаг isSilent
	this.save({isSilent: true});
	//Восстановим подмененные значения
	this.set("Operation", operation);
	if (isChain) {
		this.set("Operation", isChain);
	}
} else {
	//Если карточка открыта в целевом режиме "Редактировать запись" 
	//вызываем метод save, используем флаг isSilent
	this.save({isSilent: true});
}
Показать все комментарии

Изза того что у нас клиентский код не асинхронный, нужно использовать chain.
И есть задача сделать следующую логику

methonMain: function() {
Terrasoft.chain(
                                        var value = this.method1();
                                        if (value != null )
                                        {
                                                value2 = this.method2();
                                        }
                                        else {
                                                value2 = this.method3()
                                        }
);
},
method1: function() {
        //код обращение в БД
        return value;
},
method2: function() {
        //код обращение в БД
        return value2;
},
method2: function() {
        //код обращение в БД
        return value2;
},

Правильно ли будет отрабатывать chain мою логику ?

Нравится

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

Не правильно. Чейн должен реализовывать переход к след. методу.

Правильно:

obj = {a: 2, b: 3}

Terrasoft.chain(
function(next) {
console.log(this.a);
next();
}, function(next){
console.log(this.b)
next();
}, function(){
console.log("end");
}, obj
);

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