1) Нужно передать значение (Id выбранной записи) со страницы детали в страницу проекта, задействованной в бизнес процессе. Я так понял нужно использовать sandbox и messages. Подскажите подробнее как их использовать?
2) Добавил на деталь свою кнопку. Как по нажатию этой кнопки осуществить дальнейшее прохождение страницы проекта по бизнес процессу. Банальный this.acceptProcessElement(); не помогает.
Здравствуйте. С первым вопросом разобрался. Удалось передать сообщение по нажатию кнопки. Но это не удобно. Скажите, а можно передать сообщение по событию выделения записи в детали(событие типа onClick)? Функцию получения выделенной строки - this.getActiveRow() нашел. А где прописать событие не разобрался.
И еще вопрос по messages. Как отловить на основной странице, что сообщение из детали пришло? Т.е есть ли такое событие прихода сообщения?
Решил реализовать следующим образом: добавить кнопку в активную строку и по нажатию послать сообщение основной форме. В основной форме отловит сообщение и отправиться дальше по процессу. Что удалось найти:
Нашел на форуме, что можно добавить кнопку в активную строку.
onActiveRowAction: function(buttonTag, primaryColumnValue){switch(buttonTag){// замещение базового метода посылаем сообщение основной страницеcase"call":this.sandbox.publish("GetContactDetailActiveRecordId", this.get("TestParameter"), [this.sandbox.id]);break;default:this.callParent(arguments);break;}},
Который объявлен в BaseSectionV2 (Базовая схема раздела).
Проблема:
1) при объявлении кнопки выходит сообщение, что DataGrid не является контейнером для других объектов. Подскажите, что делаю не так?
2) Как отловить в основной форме, что пришло сообщение из детали?
За ранее спасибо.
Для получения идентификатора текущей записи детали в родительской карточке редактирования используя механизм подписки/публикации сообщений между соответствующими модулями - алгоритм будет примерно следующий:
Для начала необходимо в коде карточки и детали добавить адресное сообщение с одним и тем же названием, но в карточке с типом "Подписка", а в детали - с типом "Публикация". Например, для карточки редактирования:
Для детали точно так же, только в свойстве direction необходимо указать Terrasoft.MessageDirectionType.PUBLISH.
Далее при инициализации карточки редактирования (метод init) нужно подписаться на это сообщение, а в функции обратного вызова получить значение из детали и сохранить его в атрибут модели карточки:
Значение contactDetailSandboxId Вам необходимо определить самостоятельно (оно формируется в зависимости от названия детали). В коде детали оно хранится в свойстве this.sandbox.id.
Наконец, в коде детали, при обработке нажатия на кнопку необходимо просто опубликовать сообщение, передав значение текущей записи:
Оптимальнее будет сделать способом, который описал Олег. В случае выбора записи в DataGrid, сообщение будет генерироваться при выборе любой записи в любом гриде, что замедлит работоспособность системы.
"Демьяник Алексей Олегович" написал: В случае выбора записи в DataGrid, сообщение будет генерироваться при выборе любой записи в любом гриде, что замедлит работоспособность системы.
Здравствуйте, Алексей.
Хорошо. Понял. Подскажите а можно кнопку в DataGrid встроить? И как?
Здравствуйте, Олег. Я так реализовал уже. Но это не совсем удобно. Подскажите как встроить кнопку в датагрид? В предыдущих версиях можно было. В крайнем случае, если нельзя, как кнопку в детали выделить? Другим цветом например?
в скрипте детали в блок diff добавить дополнительные свойства для DataGrid (название и заголовок кнопки привожу в качестве примера, Вы можете изменить их на свои):
После этого при выделении активной строки в детали должна появиться синяя кнопка с заголовком MyButton.
В массив activeRowActions можно добавить несколько кнопок, они все будут отображаться в выделенной строке так же, как и в реестре раздела.
Далее в методах той же детали необходимо реализовать метод onActiveRowAction. Данный метод в качестве аргументов принимает тэг кнопки и значение ключевой колонки выделенной строки. Насколько я понял из предыдущих сообщений, Вам этой информации достаточно, но если необходимо получить какие-либо другие значения выделенной строки, можно вызвать метод this.getActiveRow(), который возвращает всю модель выделенной строки:
methods:{
onActiveRowAction: function(buttonTag, primaryColumnValue){if(buttonTag ==="myAction"){// весь код ниже можно убрать, он демонстрирует, что значения// primaryColumnValue и activeRowId равны
var activeRow =this.getActiveRow();
var activeRowId = activeRow.get("Id");
console.log(primaryColumnValue);
console.log(activeRowId);// дальше Ваша реализация
...
}},
...
}