5.8.3.2. Инициализация с помощью CreateAction
Если начальное значение атрибута зависит от данных вызывающего экрана, то можно воспользоваться методом setInitialValues()
класса CreateAction.
Рассмотрим для примера две связанные сущности:
Фрагмент XML-дескриптора экрана, отображающего одновременно списки обоих сущностей:
<dsContext>
<collectionDatasource id="typesDs"
class="com.haulmont.sample.entity.DeviceType"
view="_local">
<query>
select e from sample$DeviceType e
</query>
</collectionDatasource>
<collectionDatasource id="descriptionsDs"
class="com.haulmont.sample.entity.DeviceDescription"
view="_local">
<query>
select e from sample$DeviceDescription e where e.deviceType.id = :ds$typesDs
</query>
</collectionDatasource>
</dsContext>
<layout>
...
<table id="typeTable">
<actions>
<action id="create"/>
<action id="edit"/>
<action id="remove"/>
</actions>
<columns>
<column id="name"/>
</columns>
<rows datasource="typesDs"/>
</table>
...
<table id="descriptionTable">
<actions>
<action id="create"/>
<action id="edit"/>
<action id="remove"/>
</actions>
<columns>
<column id="description"/>
</columns>
<rows datasource="descriptionsDs"/>
</table>
</split>
</layout>
Контроллер этого экрана:
public class DeviceTypeBrowse extends AbstractLookup {
@Inject
private CollectionDatasource<DeviceType, UUID> typesDs;
@Named("descriptionTable.create")
private CreateAction descrCreateAction;
@Override
public void init(Map<String, Object> params) {
typesDs.addItemChangeListener(event -> {
descrCreateAction.setInitialValues(Collections.<String, Object>singletonMap("deviceType", event.getItem()));
});
}
}
В контроллере источнику данных typesDs
добавляется слушатель на событие изменения выбранной записи. При смене выбранной записи вызывается метод setInitialValues()
действия, и ему передается мэп с одним элементом, ключом которого является навание атрибута - deviceType
, а значением - выбранный экземпляр DeviceType
. Таким образом при выполнении действия CreateAction
в атрибуте deviceType
нового экземпляра DeviceDescription
будет сразу установлен выбранный в таблице экземпляр DeviceType
.