Если начальное значение атрибута зависит от данных вызывающего экрана, то можно воспользоваться методом 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.addListener(new CollectionDsListenerAdapter<DeviceType>() { @Override public void itemChanged(Datasource<DeviceType> ds, @Nullable DeviceType prevItem, @Nullable DeviceType item) { descrCreateAction.setInitialValues(Collections.<String, Object>singletonMap("deviceType", item)); } }); } }
В контроллере источнику данных typesDs
добавляется слушатель на событие изменения выбранной записи. При смене выбранной записи вызывается метод setInitialValues()
действия, и ему передается мэп с одним элементом, ключом которого является навание атрибута - deviceType
, а значением - выбранный экземпляр DeviceType
. Таким образом при выполнении действия CreateAction
в атрибуте deviceType
нового экземпляра DeviceDescription
будет сразу установлен выбранный в таблице экземпляр DeviceType
.