我正在使用Lit-HTML(而不是Lit-Element)来构建一个html表单.表格非常简单,它有2个下拉列表:种群下拉列表和动物下拉列表.

动物下拉列表选项取决于种群下拉列表的 Select .请参见getAnimalDS()逻辑.

Model Definition & Utility function:

const model = {
    Population: null,
    Animal: null,
}

const dataSources = {
    Populations: [null, "p1", "p2"],
    Animals_1:   [null, "a1", "a2"],
    Animals_2:   [null, "a3", "a4", "a5"],
}

function getAnimalDS(population) {
    switch (population) {
        case 'p1':
            return dataSources.Animals_1;
        case 'p2':
            return dataSources.Animals_2;
        default:
            return [];
    }
}

The main function to build LIT-HTML template:

function buildSection1(model) {
    return html`
    
    <div class="mb-3">
        <label for="Population" class="form-label">Population</label>
        <select id="Population" name="Population" class="form-control"
            .value="${model.Population}" @change=${e => {
                            model.Population = e.target.value;
                            model.Animal = null; // Reset Animal
                            renderSection1(); // Re-render the form
                     }}>

            ${dataSources.Populations.map((item) => html`
                    <option value="${item}" ?selected="${model.Population === item}">${item}</option>
            `)}
        </select>
    </div>

    <div class="mb-3">
        <label for="Animal" class="form-label">Animal</label>
        <select id="Animal" name="Animal" class="form-control"
            .value="${model.Animal}" @change=${e => model.Animal = e.target.value}>

            ${getAnimalDS(model.Population).map((item) => html`
                    <option value="${item}" ?selected="${model.Animal === item}">${item}</option>
            `)}
        </select>
    </div>

    `;
}

TESTING:

如果我在种群下拉列表中 Select 一个种群,我会看到动物上的选项被正确地更改了-&gt;太棒了.

STEPS to see issue:

#1:在种群下拉列表中 Select 选项"p1",我在动物下拉列表中看到3个选项:""、‘a1’、‘a2’--很好

#2:接下来,我在动物下拉列表中 Select ‘a2’( Select 的索引=2)-&gt;Good

#3:现在,在种群下拉列表中 Select 选项p2,我在动物下拉列表中看到4个选项:""、‘a3’、‘a4’、‘a5’-&gt;好

#4:此时,我希望在Animal下拉列表中看到‘Empty’行(选定索引=-1),因为在@Change of the Popular时,我确实将mod.Animal重置为空.

-但动物下拉列表显示选项‘A4’(选定索引=2)

-这意味着LIT-HTML第2步使用先前 Select 的索引=2.

有什么 comments 吗?谢谢!

推荐答案

出现这种行为的原因是,it-html不知道第二个<select id="Animal">元素的值已经更改,因为@change事件处理程序将model.Animal更改为'a2',但不会再次调用render().因为it-html认为该值仍然是null,所以在重新呈现时它不会费心更新DOM.

解决方案1:您可以通过在那里添加renderSection1()呼叫来解决此问题,如下所示:

html`
  ...
  <select id="Animal" name="Animal" class="form-control"
    .value="${model.Animal}"
    @change=${e => {
      model.Animal = e.target.value;
      renderSection1();
    }}>
  ...
  </select>`

这使得Lit-html知道该值已经被更新.因此,当第一个下拉列表将值改回null时,它再次知道它是不同的,并更新DOM.

解决方案2:或者,您也可以使用live() directive:

import {live} from 'lit-html/directives/live.js';

html`
  ...
  <select id="Animal" name="Animal" class="form-control"
    .value="${live(model.Animal)}" // always compare against DOM
    @change=${e => model.Animal = e.target.value}>
  ...
  </select>`

Javascript相关问答推荐

如何解决这个未能在响应上执行json:body stream已读问题?

Vega中的模运算符

提交表格后保留Web表格中的收件箱值?

模块与独立组件

使用续集和下拉栏显示模型属性

在页面上滚动 timeshift 动垂直滚动条

MongoDB中的引用

手机上的渲染错误文本必须在文本组件中渲染,但在浏览器上没有问题<><>

Regex结果包含额外的match/group,只带一个返回

Javascript json定制

单个HTML中的多个HTML文件

Webpack在导入前混淆文件名

警告框不显示包含HTML输入字段的总和

在表单集中保存更改时删除';禁用';

使用Reaction窗体挂钩注册日历组件

如何在下一个js中更改每个标记APEXCHARTS图表的 colored颜色

FindByIdAndUpdate在嵌套对象中创建_id

如何在每隔2分钟刷新OKTA令牌后停止页面刷新

如何格式化API的响应

单击时同时 Select 和展开可访问的行