Коллеги, подскажите как реализовать такую логику.
В некой детали нужно заблокировать функцию по добавлению новой записи в неё, если уже существует в ней запись, хотя бы одна.
В идеале вобще это поле убрать из видимости.
Нравится
Здравствуйте, Михаил.
Вам необходимо:
1) Заместить схему карточки на которой выведена данная деталь.
2) Добавить в секции diff для данной детали свойство visible ссылающееся виртуальный атрибут булевого типа имеющий значение по умолачанию true.
3) Заместить схему детали и добавить обработчик события изменения атрибута GridData
[javascript]
init: function() {
this.callParent(arguments);
this.on("change:GridData", function(){
//some code
}, this);
}
[/javascript]
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обьявить следующим образом:
[javascript]
attributes: {
IsEmailVisible: {
dataValueType: this.Terrasoft.DataValueType.BOOLEAN,
type: this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
value: true
}
},
[/javascript]
Пример привязки видимости детали Email к атрибуту:
[javascript]
{
"operation": "merge",
"name": "Email",
"values": {
"visible": {
bindTo: "IsEmailVisible"
}
}
},
[/javascript]
"Мотков Илья" написал:4) В обработчике (пункт 3) проверять количество элементов в GridData. Если больше нуля - публиковать сообщение.
А проверять DataGrid по средствам esq или как-то иначе можно? Или можно как то читать то, что находится на самой детали, чтобы каждый раз в базу не ходить?
GridData это атрибут схемы детали. Получить его можно через код:
var gridData = this.get("GridData");
Затем необходимо проанализировать его содержимое. Отладку необходимо провести в отладчике самого браузера.
В целом GridData отвечает за реестр детали.
"Мотков Илья" написал:GridData это атрибут схемы детали. Получить его можно через код:
var gridData = this.get("GridData");
Затем необходимо проанализировать его содержимое. Отладку необходимо провести в отладчике самого браузера.
В целом GridData отвечает за реестр детали.
[javascript]
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()}]
}
});
}
}
[/javascript]
Поле 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).
Спасибо, но я заодно и с песочницей разобрался, на будущее.