开发Jmix自定义UI DB交互

问题描述 投票:0回答:1

对于我们正在 Jmix 上开发的公司项目 https://www.jmix.io/ 。 我们需要创建 Jmix 到 GUI 到 DB 的交互,以便从实体获取值并将其放在经典 UI 组件上。编辑值并将其保存回数据库。 可能使用 Enum Type 和 multiValuePicker 组件来添加和删除值 以详细形式。

java spring vaadin jmix
1个回答
0
投票

按照我创建 DB->GUI 和 GUI->DB 交互的步骤 Jmix GUI Example

定义枚举以获得我们需要的选择

// www.data-ware.it
public enum it.data-ware.ValueEnum implements EnumClass<String> {
    32BIT("32BIT"),
    64BIT("64BIT"),
....
}

将组件放置在实体的“详细信息”视图上

<formLayout id="form" dataContainer="nameDc">
                    <multiValuePicker id="architectureValuePicker" label="Architecture">
                        <actions>
                            <action id="select" type="multi_value_select">
                                <properties>
                                    <!-- mind the gap --> 
                                    <!-- we are handling ValueEnum Object --> 
                                    <!-- mind the gap --> 
                                    <property name="enumClass" value="it.data-ware.example.entity.ValueEnum "/>
                                </properties>
                            </action>
                            <action id="clear" type="value_clear"/>
                        </actions>
                    </multiValuePicker>
</formLayout>

在详细信息视图代码表单上,我们需要处理来自 Jmix 的事件 公共类 CustomEntityDetailView 扩展 StandardDetailView { }

首先注入组件valuePicker,定义在xml表单上

@ViewComponent
private JmixMultiValuePicker<Object> valuePicker;

然后订阅onReady事件,以便将组件值填充到UI组件中

// www.data-ware.it
@Subscribe
public void onReady(final ReadyEvent event) {
    // ...
    final String architecture = getEditedEntity().getArchitecture();

    // ...
    final String[]          architectureParts     = architecture.split(";");
    final ArrayList<Object> valuePartsEnum = new ArrayList<>();

    // ...
    for (String architecturePart : architectureParts) {
        // mind the gap
        // from string to Enum 
        final ValueEnum item = ValueEnum.fromId(architecturePart);
        valuePartsEnum .add(item);
    }

    // ...
    valuePicker.setValue(valuePartsEnum );
  }

最后订阅 onBeforeSave 事件以从 UI 获取组件值并将其设置到 Entity 字段上以允许 Jmix 保存它。

@Subscribe
public void onBeforeSave(final BeforeSaveEvent event) {
    // ...
    getEditedEntity().setArchitecture("");

    // set empty field and exit
    if (!architectureValuePicker.isEmpty()) {
        // ...
        final Collection<Object> collection = valuePicker.getValue();

        // ...
        final StringBuffer architectureParts = new StringBuffer();

        // ...
        collection.forEach((temp) -> {
            architectureParts.append(temp).append(";");
        });

        // ...
        architectureParts.setLength(architectureParts.length() - 1);
        final String architecture = architectureParts.toString();

        // ...
        getEditedEntity().setArchitecture(architecture);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.