Добрый день, коммьюнити,
Дисклеймер: Всё, что описано в этом посте для многих будет просто и знакомо. Вместе с тем, я оставлю это здесь, чтобы впервые столкнувшиеся с подобной задачей не ломали голову зря, т.к. разные посты на коммьюнити при решении этой задачи меня самого ввели в легкое заблуждение)
Задача:
Как есть: при возвращении на предыдущую карточку после сохранения записи, детали в ней не обновляются. Пример: в карточке [Лид] есть деталь [Продукт в лиде], в которой есть кнопка "+". После нажатия на кнопку появляется окно, в котором мы можем открыть страницу добавления продукта (кнопка "Добавить"). После заполнения продукта и нажатия "Сохранить" логика добавляет запись с новым продуктом в деталь [Продукт в лиде]. При этом для того чтобы увидеть новую запись при возвращении на карточку [Лид] деталь нужно обновлять вручную.
Как должно быть: при возвращении на карточку [Лид] деталь должна обновляться автоматически.
Ограничения: крайне нежелательно реализовывать обновление с помощью 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");
}
Спасибо!