javascript - JavaScript 如何创建与 DOM 元素的单向数据绑定(bind)?

标签 javascript html class dom ecmascript-6

我不知道“单向数据绑定(bind)”实际上是否是正确的定义,但我有一个名为 timesheetRow 的类,调用时代表表中的一行。

该类有一个名为 generateRow() 的方法,它绑定(bind) <td>元素到对象属性,然后将它们全部附加到父项 <tr>元素。我这样做是因为在返回行之前,我必须添加一些事件监听器以进行验证。代码是这样的:

class timesheetRow{

    generateRow(){

        this.row = htmlToElement(`
            <tr>
            </tr>
        `);

        this.nodes.workHours = htmlToElement(`
            <td>
                <input name="workHours" 
                min=0 
                max=24 
                class="form-control workHours" 
                type="number">
            </td>
        `);

        this.nodes.workProject = htmlToElement(`
            <td>
                <select name="workProject" 
                class="form-control workProject" 
                required>
                    <option disabled selected value="">Sin proyecto asignado</option>
                    <option value="1">Proyecto 1</option>
                </select>
            </td>
        `);

        this.nodes.workHours.addEventListener("input", event => {
            this.row.querySelector('.workProject').disabled = parseInt(event.target.value) < 1;
        });

        for (let node in this.nodes) {
            this.row.appendChild(this.nodes[node]);
        }

        return this.row;
    }
}

这是实际代码的一个非常精简的版本,但我希望它能够澄清我的问题。

如果您看一下我添加到 workHours 元素中的事件监听器,它会直接作用于作为我的对象属性之一存储的行,但更改该属性也会自动更改 DOM。因此,据我所知,这看起来像是单向数据绑定(bind)。当 workHours 值低于 1 时,workProject 选择元素将被禁用。我没有直接更改 DOM,而是更改我的对象。

我想知道这里的幕后发生了什么。预先感谢所有花时间回答我的问题的人!

最佳答案

this.row.querySelector('.workProject') 返回对 DOM 节点的引用,该节点是表示 DOM 节点的对象。

disabledselect 节点上的一个属性,它控制浏览器呈现它的方式。当您更改 disabled 属性时,渲染引擎本身知道它需要重新绘制输入。

没有涉及任何魔法。

  1. 您在输入中键入内容,将调度 input 事件

  2. 您在 input 上添加了一个 input 监听器,因此每次 (1) 发生时都会调用该监听器

  3. 您的监听器获取对 select 的引用并更改其属性

  4. 负责渲染 DOM 的浏览器/事物的设计方式是,更改 select 上的 disabled 属性可以实现人们所期望的效果

还有this.row.querySelector('.workProject') !== this.nodes.workProject

关于javascript - JavaScript 如何创建与 DOM 元素的单向数据绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55242082/

相关文章:

python - 两种类型的类属性定义之间的区别?

class - Powershell 5 类的 Pester 模拟方法

javascript - 在 JavaScript 类中调用嵌套函数

javascript - 如何在javascript中找到两个不不同数组的差异?我使用了下划线,但我对普通 JS 持开放态度

javascript - 获取单选按钮的选定值

javascript - 自定义下拉图像而不是默认箭头

javascript - 如何找出元素被短暂禁用的原因?

javascript - 限制在输入文本框中使用下划线 ('_' )

javascript - 为什么浏览器操作总是被触发?为什么新闻没有被解雇?

javascript - 。我如何parentNode.removeChild();一个分区。用数组中的名称? (纯 Java 脚本)