Работа элемента управления с данными карточки
Чтобы элемент управления мог работать с данными карточки, его необходимо определённым образом подготовить:
-
Добавьте в описатель элемента управления свойства:
DataSource,DataFieldиBinding.Текстовый описатель:… <Properties> … <Property Type="DataSource" /> <Property Type="DataField" /> <Property Type="Binding" /> <Property Type="ExtendedDataSource" /> (1) </Properties>1 Не обязательно. Бинарный описатель:… PropertyDescriptions = { … PropertyFactory.GetDataSourceProperty(), PropertyFactory.GetDataFieldProperty(), PropertyFactory.GetBindingProperty(), PropertyFactory.GetExtendedDataSourceProperty(), } -
Добавить в клиентский компонент элемента управления в класс параметров поле для хранения значения элемента управления. Тип поля должен соответствовать типу значения элемента управления.
export class SomeControlParams extends BaseControlParams { @rw value?: string; } -
Добавить в клиентский компонент элемента управления в интерфейс состояния поле для хранения биндинга. Тип поля должен быть
IBindingResult<string>. Типstringнужно заменить на тип значения элемента управления.export interface SomeControlState extends SomeControlParams, BaseControlState { binding: IBindingResult<string>(1) }1 Если элемент управления предназначен только для чтения значения (изменять не требуется), свойство bindingне требуется. -
Добавить в клиентский компонент элемента управления в интерфейсный класс set-метод, загружающий значение элемента управления. Метод должен быть помечен декоратором
@handler("binding").@handler("binding") private set binding(binding: IBindingResult<string>) { this.state.value = binding && binding.value; this.state.binding = binding; } -
Добавить в клиентский компонент элемента управления в интерфейсный класс метод, возвращающий биндинги.
-
В класс реализации добавить функцию, сохраняющую значение элемента управления в поле
value.changedHandler = (event) => { this.state.value = event.target.value; this.forceUpdate(); }В составе биндинга может быть передана операция редактирования, настраиваемая в программе Конструктор Web-разметок. Операцию редактирования можно использовать, чтобы ограничить возможность изменять значение элемента управления или его скрытия.
Чтобы использовать операцию редактирования, необходимо:-
Добавить в описатель элемента управления свойство EditOperation:
<Properties> (1) <Property Type="DataSource" /> <Property Type="DataField" /> <Property Type="Binding" /> <Property Type="EditOperation" /> (2) </Properties>1 Свойства, перечисленные ранее, также должны быть указаны. 2 Добавляем операцию редактирования. -
Добавить код проверки операции редактирования в функцию загрузки значения элемента управления (binding):
@handler("binding") protected set binding(binding: IBindingResult<boolean>) { this.state.canEdit = !binding || editOperations.available(binding.editOperation); }
-
Проверка прав пользователя на изменение значения
Возможность изменения значения ЭУ (или выполнения других операций) проверяется по доступности пользователю операции редактирования.
Чтобы добавить возможность настраивать для ЭУ операцию редактирования, нужно добавить в описатель элемента управления свойство EditOperation.
<?xml version="1.0" encoding="utf-8" ?>
<Controls>
<Control Name="Somecontrol" DisplayName="Somecontrol">
<Properties>
<Property Type="Name" />
<Property Type="DataSource" /> (1)
<Property Type="DataField" />
<Property Type="Binding" />
<Property Type="EditOperation" /> (2)
</Properties>
</Control>
</Controls>
| 1 | Свойства, используемые для связывания ЭУ с данными карточки. |
| 2 | Свойство Операция редактирования. |
Свойство Операция редактирования передается в представительную часть в биндинге, поэтому свойство Binding также должно быть в описателе элемента управления.
-
Добавить в "интерфейс состояния" поле, в которое будет сохраняться результат проверки.
-
В "интерфейсном классе" в методе, отвечающем за загрузку биндинга, организовать проверку операции редактирования:
@handler("binding") protected set binding(binding: IBindingResult<boolean>) { this.state.canEdit = !binding || this.props.services.editOperations.available(binding.editOperation) (1) }1 Сохраняем результат проверки доступности операции в поле canEdit.
В приведенном коде проверка доступности операции осуществляется с помощью клиентского сервиса $EditOperationStore. Подробности в пункте Получение сервисов в клиентском компоненте.
|