5.8.2.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.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.