Динамические данные в lookupPickerField - PullRequest
0 голосов
/ 31 мая 2018

У меня экран и контроллер экрана .На экране присутствуют два компонента lookupPickerField.

Простая задача - при изменении значения в первом из них (PK) во втором должны быть загружены зависимые значения (FK).

Дескриптор моего экрана:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<window xmlns="http://schemas.haulmont.com/cuba/window.xsd"
        caption="msg://editCaption"
        class="com.tkbbank.client.web.item.CardItemEdit"
        datasource="cardItemDs"
        focusComponent="fieldGroup"
        messagesPack="com.tkbbank.client.web.item">

     <dsContext>
        <datasource id="cardItemDs" class="com.tkbbank.client.entity.CardItem" allowCommit="false"/>
            <collectionDatasource id="cardTypeDs" class="com.tkbbank.client.entity.CardType" view="_local">
            <query>
                <![CDATA[select e from demo$CardType e]]>
            </query>
        </collectionDatasource>
            <collectionDatasource id="cardSubTypeDs" class="com.tkbbank.client.entity.CardSubType" view="_local">
            <query>
                <![CDATA[select s from demo$CardSubType s where s.cardType.id = :component$cardSubTypePicker.id]]>
            </query>
        </collectionDatasource>
    </dsContext>

    <dialogMode forceDialog="true" width="AUTO"/>
    <layout expand="windowActions" spacing="true">
        <fieldGroup id="fieldGroup" datasource="cardItemDs">
            <column width="500px">

                <field id="cardType" caption="Тип документа">
                    <lookupPickerField id="cardTypePicker" optionsDatasource="cardTypeDs"/>
                </field>
                <field id="cardSubType" caption="Подтип документа">
                    <lookupPickerField id="cardSubTypePicker" optionsDatasource="cardSubTypeDs"/>
                </field>

                // Skipped

Контроллер моего экрана:

public class CardItemEdit extends AbstractEditor<CardItem> {

    @Inject
    private Datasource<CardItem> cardItemDs;

    @Inject
    private Metadata metadata;

    @Inject
    private CollectionDatasource<CardSubType, UUID> cardSubTypeDs;

    @Inject
    private LookupPickerField cardTypePicker;

    @Override
    public void init(Map<String, Object> params) {
        CardItem cardItem = metadata.create(CardItem.class);
        cardItemDs.setItem(cardItem);

        cardTypePicker.addValueChangeListener(e -> cardSubTypeDs.refresh());
    }
}

Сущность CardSubType:

@NamePattern("Подтип входящего документа: %s |subtype")
@Table(name = "DEMO_CARD_SUB_TYPE")
@Entity(name = "demo$CardSubType")
public class CardSubType extends StandardEntity {
    private static final long serialVersionUID = -3558412722346178348L;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "CARD_TYPE_ID")
    protected CardType cardType;

    // Skipped

Итак, я выбираю значение в cardTypePicker, но второй компонент остается пустым.Обе таблицы содержат данные.

enter image description here

В чем может быть проблема?

Буду очень признателен за информацию.Спасибо всем.

1 Ответ

0 голосов
/ 01 июня 2018

Марио Дэвид ответил на этот вопрос здесь .

Спасибо, Марио!

Со следующим источником данных для экрана все выпадающее меню работает хорошо:

 <dsContext>
    <datasource id="cardItemDs" class="com.tkbbank.client.entity.CardItem" allowCommit="false" view="card-item-view"/>
        <collectionDatasource id="cardTypeDs" class="com.tkbbank.client.entity.CardType">
        <query>
            <![CDATA[select e from demo$CardType e]]>
        </query>
    </collectionDatasource>
        <collectionDatasource id="cardSubTypeDs" class="com.tkbbank.client.entity.CardSubType">
        <query>
            <![CDATA[select s from demo$CardSubType s where s.cardType.id = :ds$cardTypeDs]]>
        </query>
    </collectionDatasource>
</dsContext>
...