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