Публикация

Обновление детали при возвращении на предыдущую карточку

Добрый день, коммьюнити,



Дисклеймер: Всё, что описано в этом посте для многих будет просто и знакомо. Вместе с тем, я оставлю это здесь, чтобы впервые столкнувшиеся с подобной задачей не ломали голову зря, т.к. разные посты на коммьюнити при решении этой задачи меня самого ввели в легкое заблуждение)



Задача:

Как есть: при возвращении на предыдущую карточку после сохранения записи, детали в ней не обновляются. Пример: в карточке [Лид] есть деталь [Продукт в лиде], в которой есть кнопка "+". После нажатия на кнопку появляется окно, в котором мы можем открыть страницу добавления продукта (кнопка "Добавить"). После заполнения продукта и нажатия "Сохранить" логика добавляет запись с новым продуктом в деталь [Продукт в лиде]. При этом для того чтобы увидеть новую запись при возвращении на карточку [Лид] деталь нужно обновлять вручную.

Как должно быть: при возвращении на карточку [Лид] деталь должна обновляться автоматически.

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



Решение:

При возврате не работают методы init и onEntityInitialized, а срабатывает только onRender, поэтому нам придется отлавливать момент когда рендерится деталь. Сразу скажу, что пытался сделать проще и обновлять деталь при onRender карточки, но не сработало. Видимо из-за того, что сама деталь в этот момент еще не отрендерена. Может такой способ прокатит в вашем случае :)



Порядок логики:

1. наступает onRender детали

2. деталь шлет сообщение карточке

3. карточка вызывает updateDetail



Выглядит просто) но обратите внимание на один нюанс: коммьюнити пестрит советами о применении метода this.reloadEntity('имя детали'). Он не работает! Это устаревшая логика, она пытается получить this.entitySchemaInfo, которая не существует. Вместо этого мы будем использовать this.updateDetail.

Важно, что имя детали в методе this.updateDetail нужно получить не из карточки. Это должно быть имя из this.details. В режиме отладки карточки [Лид] (в нашем случае) нужно вызвать в консоли this.details, найти нужную нам деталь и скопировать значение свойства "detailName".



Пример реализации:

В схеме детали:

messages: {
	"ReloadLeadProductDetailV2": {
		mode: Terrasoft.MessageMode.PTP,
		direction: Terrasoft.MessageDirectionType.PUBLISH
	}
},
methods: {
	onRender: function() {
		var args = {};
		this.sandbox.publish("ReloadLeadProductDetailV2", args, ["reloadLeadProduct"]);
		console.log("ReloadLeadProductDetailV2 message sent");
		this.callParent(arguments);
	}
}

В схеме карточки:



 

		messages: {
			"ReloadLeadProductDetailV2": {
				mode: Terrasoft.MessageMode.PTP,
				direction: Terrasoft.MessageDirectionType.SUBSCRIBE
			},
		},
init: function() {
 this.sandbox.subscribe("ReloadLeadProductDetailV2", this.onReloadLeadProductDetailV2, this, ["reloadLeadProduct"]);
			},
onReloadLeadProductDetailV2: function() {
	if (this.details) //на всякий случай проверяем загрузились ли детали
	{
		this.updateDetail({"detail": "LeadProduct279471775c00"});
	}
	console.log("ReloadLeadProductDetail Success");
}

Спасибо!

Нравится

Поделиться

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