Запрет на добавление объекта через деталь

Коллеги, подскажите как реализовать такую логику.
В некой детали нужно заблокировать функцию по добавлению новой записи в неё, если уже существует в ней запись, хотя бы одна.
В идеале вобще это поле убрать из видимости.

Нравится

11 комментариев

Здравствуйте, Михаил.

Вам необходимо:

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) Заместить схему детали и добавить обработчик события изменения атрибута GridData

init: 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).


Спасибо, но я заодно и с песочницей разобрался, на будущее.

Показать все комментарии