Коллеги, подскажите как реализовать такую логику.
В некой детали нужно заблокировать функцию по добавлению новой записи в неё, если уже существует в ней запись, хотя бы одна.
В идеале вобще это поле убрать из видимости.
Нравится
Здравствуйте, Михаил.
Вам необходимо:
1) Заместить схему карточки на которой выведена данная деталь.
2) Добавить в секции diff для данной детали свойство visible ссылающееся виртуальный атрибут булевого типа имеющий значение по умолачанию true.
3) Заместить схему детали и добавить обработчик события изменения атрибута GridData
init: function() { this.callParent(arguments); this.on("change:GridData", function(){ //some code }, this); }
4) В обработчике (пункт 3) проверять количество элементов в GridData. Если больше нуля - публиковать сообщение.
5) В схеме карточки основываясь на сообщении изменять значение виртуального атрибута.
Сообщения sandbox подробно обсуждались тут.
"Мотков Илья" написал:Здравствуйте, Михаил.
Вам необходимо:
1) Заместить схему карточки на которой выведена данная деталь.
2) Добавить в секции diff для данной детали свойство visible ссылающееся виртуальный атрибут булевого типа имеющий значение по умолачанию true.
3) Заместить схему детали и добавить обработчик события изменения атрибута GridDatainit: function() {
this.callParent(arguments);
this.on("change:GridData", function(){
//some code
}, this);
}4) В обработчике (пункт 3) проверять количество элементов в GridData. Если больше нуля - публиковать сообщение.
5) В схеме карточки основываясь на сообщении изменять значение виртуального атрибута.
Сообщения sandbox подробно обсуждались тут.
А есть явный какой-то пример в исходниках чтобы на него акцент делать?
Подобного примера в конфигурации нет. Однако почти в каждой схеме есть примеры создания атрибутов, привязки свойства visible к методу или же атрибуту. Точно так же sandbox повсеместно используеьтся в системе.
К примеру атрибут можно jобьявить следующим образом:
attributes: { IsEmailVisible: { dataValueType: this.Terrasoft.DataValueType.BOOLEAN, type: this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN, value: true } },
Пример привязки видимости детали Email к атрибуту:
{ "operation": "merge", "name": "Email", "values": { "visible": { bindTo: "IsEmailVisible" } } },
"Мотков Илья" написал:4) В обработчике (пункт 3) проверять количество элементов в GridData. Если больше нуля - публиковать сообщение.
А проверять DataGrid по средствам esq или как-то иначе можно? Или можно как то читать то, что находится на самой детали, чтобы каждый раз в базу не ходить?
GridData это атрибут схемы детали. Получить его можно через код:
var gridData = this.get("GridData");
Затем необходимо проанализировать его содержимое. Отладку необходимо провести в отладчике самого браузера.
В целом GridData отвечает за реестр детали.
"Мотков Илья" написал:GridData это атрибут схемы детали. Получить его можно через код:
var gridData = this.get("GridData");
Затем необходимо проанализировать его содержимое. Отладку необходимо провести в отладчике самого браузера.
В целом GridData отвечает за реестр детали.
init: function() { this.callParent(arguments); var gridData = this.getGridData(); this.reloadGridColumnsConfig(true); if (gridData && gridData.getCount() > 0) { this.sandbox.publish("MessageGridCount", { stateObj: { valuePairs: [{name: "DataGridCount", value: gridData.getCount()}] } }); } }
Поле gridData в консоли указывает что undefined. Как с этим бороться? За пример брал реализацию в BaseGridDetailV2.
Так же ваш пример (var gridData = this.get("GridData");) тоже самое выдает в консоли.
Попробуйте получать GridData в методе после его загрузки:
afterLoadGridData: function() {
this.callParent(arguments);
var gridData = this.get("GridData");
},
"Максим Шевченко" написал:Попробуйте получать GridData в методе после его загрузки:
afterLoadGridData: function() {
this.callParent(arguments);
var gridData = this.get("GridData");
},
Попробовал, но тоже никак.
http://prntscr.com/dy1c0z
Получить значение GridData можно обратившись к атрибуту Collection (this.get("Collection")) или же вызвав метод getGridData который в свою очередь обратится к атрибуту Collection и вернет результат.
Получать актуальное количество записей в GridData возможно заместив обработчик события dataLoaded атрибута Collection. Пример:
onGridLoaded: function() {
this.callParent(arguments);
var count = this.getGridData().collection.items.length;
}
Прошу прощения за неточность. Публиковать сообщение не нужно, по скольку логика добавления записи (как собственно и кнопка +) расположена в BaseGridDetalV2 (элемент AddRecordButton).
"Мотков Илья" написал:Прошу прощения за неточность. Публиковать сообщение не нужно, по скольку логика добавления записи (как собственно и кнопка +) расположена в BaseGridDetalV2 (элемент AddRecordButton).
Спасибо, но я заодно и с песочницей разобрался, на будущее.