如何在常规 html 页面(无 java)上通过 POST 从 Vaadin Web 组件获取值?

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

我正在尝试在网页上使用 vaadin Web 组件。在 POST 上,组件 vaadin-combo-box 发送选定的标签,而不是值;并且 vaadin-select 不在 POST 值中。

最新 vaadin 24.3.10 组件(在 Caddy 代理后面的 Bun / Elysia 上)

我将代码缩小到这个较小的页面进行测试。它包括 4 个 vaadin 组件:文本字段、单选组、选择和组合框。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vaadin Debug</title>

    <!-- include all vaadin core components -->
    <script type="module" src="/assets/vaadin-resources.js"></script>
    <link rel="stylesheet" href="/assets/styles/styles.css">
</head>

<body style="font-family: var(--lumo-font-family); color: var(--lumo-body-text-color); background-color: var(--lumo-base-color);"></body>

<div style="width:600px; margin: 0 auto" class="border border-contrast-80 border-primary bg-base rounded-l shadow-m">
    <div class="">
        <form id="myForm" name="object-form" action="/partials/object/Entity/0000" method="post">

            <vaadin-text-field id='vaadin-text-field' name='vaadin-text-field' label='vaadin-text-field'>
            </vaadin-text-field>

            <vaadin-combo-box id='vaadin-combo-box' name='vaadin-combo-box' label='vaadin-combo-box'>
            </vaadin-combo-box>
            <script>
                comboBox = document.querySelector('#vaadin-combo-box');
                comboBox.items = [
                    { value: 'a38e43f4-cffd-11ee-baef-1fedb4776d81', label: 'France' },
                    { value: '05cc2734-f295-11ee-bcda-239311358179', label: 'Germany' },
                    { value: '05d11b40-f295-11ee-bcda-674883960b70', label: 'Spain' }
                ];
                comboBox.value = 'a38e43f4-cffd-11ee-baef-1fedb4776d81';
                console.log("vaadin-combo-box")
            </script>

            <vaadin-select id='vaadin-select' name='vaadin-select' label='vaadin-select'>
            </vaadin-select>
            <script>
                select = document.querySelector('#vaadin-select');
                select.items = [
                    {  label: 'Label A', value: 'ce1521d8-cffd-11ee-baef-477d625ddaa8' },
                    {  label: 'Label B', value: 'ce2e4046-cffd-11ee-baef-93b6cbfb74ea' },
                    {  label: 'Label C', value: '45de575e-ea28-11ee-8718-df0dd9251f5f' }
                ];
                select.value = 'ce1521d8-cffd-11ee-baef-477d625ddaa8';
                console.log("vaadin-select updated")                    
            </script>

            <vaadin-radio-group id='vaadin-radio-group' name='vaadin-radio-group' label='vaadin-radio-group'>
                <vaadin-radio-button value="v1" label="Value 1" checked></vaadin-radio-button>
                <vaadin-radio-button value="v2" label="Value 2"></vaadin-radio-button>
                <vaadin-radio-button value="v3" label="Value 3"></vaadin-radio-button>
            </vaadin-radio-group>

            <button type="submit">Save</button>
        </form>
        <script>
            document.getElementById('myForm').addEventListener('submit', function (event) {
                event.preventDefault(); // Stop the form from submitting

                console.log("Values of elements");
                console.log('vaadin-text-field:', document.querySelector('#vaadin-text-field').value);
                console.log('vaadin-combo-box:', document.querySelector('#vaadin-combo-box').value);
                console.log('vaadin-select:', document.querySelector('#vaadin-select').value);
                console.log('vaadin-radio-group:', document.querySelector('#vaadin-radio-group').value);

                console.log("Form values");
                const formData = new FormData(this);
                for (let [key, value] of formData.entries()) {
                    console.log(key, value);
                }
            });
        </script>
    </div>
</div>
</body>
</html>

“保存”按钮在控制台中显示此内容:

Values of elements
vaadin-text-field: MyText
vaadin-combo-box: a38e43f4-cffd-11ee-baef-1fedb4776d81
vaadin-select: ce1521d8-cffd-11ee-baef-477d625ddaa8
vaadin-radio-group: v1

Form values
vaadin-text-field MyText
vaadin-combo-box France
vaadin-radio-group-18 v1

发布的值是错误的:

  • 包含标签,而不是值
  • 不包含来自 vaadin-select 的值或标签

结果应该是:

vaadin-text-field: MyText
vaadin-combo-box: a38e43f4-cffd-11ee-baef-1fedb4776d81
vaadin-select: ce1521d8-cffd-11ee-baef-477d625ddaa8
vaadin-radio-group: v1
html forms post vaadin
1个回答
0
投票

gtihub 上得到答案:“vaadin-select Web 组件不支持正确提交表单,因为它没有使用元素。 考虑使用 formdata 事件手动设置与 vaadin-select 相对应的值作为解决方法。”

因此,虽然这些组件令人惊叹,但我不太确定它们应该被称为“Web 组件”,因为它们的行为并不像真正的组件。我希望 webawesome 组件能够兑现他们的承诺......

© www.soinside.com 2019 - 2024. All rights reserved.