【问题标题】:Web Components: How to listen to form input changesWeb 组件:如何监听表单输入的变化
【发布时间】:2020-07-03 16:01:03
【问题描述】:

我正在开发一个应该通过表单将数据发送到服务器的 Web 组件。在此示例中,我有对象 Meal 并希望将 name 从表单发送到服务器。

HTML 由 handlers.js 呈现,如下所示:我将我的组件的输入字段“名称”的值保存在 mapDOM 方法中。

export default {
    render() {
        return `${this.html()}`;
    },

     mapDOM(scope) {
        return {
            name: scope.getElementById('name').value,
          }
    },
 
    html() {
        return `<form id="addEssenForm">
                   <div class="form-group">
                     <label for="name">Name*</label>
                     <input class="form-control" id="name" type="text">
                   </div>
                   <button id="submit" class="btn" type="submit">Hinzufügen</button>
                </form>                
                `
    }

meal-add.component.js

export default class MealAddComponent extends HTMLElement {

constructor() {
    super();
    this.attachShadow({mode: 'open'});
    this.shadowRoot.innerHTML = Template.render();
    this.dom = Template.mapDOM(this.shadowRoot);

    this.shadowRoot.addEventListener('change', e => {
            // Now get the new values of the input field.
        }
    );
  }

现在我不知道我的组件如何获得输入中所做的更改。事件监听器确实在工作,每次我更新输入字段时它都会触发该方法。

【问题讨论】:

    标签: javascript event-handling web-component shadow-dom


    【解决方案1】:

    attributeChangedCallback 不会触发,因为您没有更改 &lt;meal-add&gt; 元素(或您给它的任何名称)上的 属性 name

    我不明白需要 MutationObserver。
    将 EventListener 附加到 inputbutton,您可以在主机文档中触发 submit 事件。如果您从 shadowDOM 中发出事件,请记住设置 composed:true 以便它转义 shadowDOM

    另请注意:

     super();
     this.attachShadow({mode: 'open'});
     this.shadowRoot.innerHTML = Template.render();
    

    可以写成:

     super()
       .attachShadow({mode: 'open'})
       .innerHTML = Template.render();
    

    【讨论】:

    • 我认为你是对的,忽略了 MutationObserver 的工作。现在我问自己,如何从模板中获取输入字段name 的当前值?我想将 EventListener 添加到 essen-add.component.js 而不是 template.js
    • 在紧密耦合的情况下,您可以调用另一个组件上的 setter 来重新获取值(或 getAttribute,如果可用的话) 对于松散耦合的组件,最好与 custom 进行所有通信b> 事件,这样组件在 DOM 中的位置无关紧要。如果您愿意,可以将侦听器附加到第一个共享父级或以上.. 一直到document。那是更多样板代码,但灵活
    • 不是您的用例,但足够接近,使用事件的表单和查找字段:jsfiddle.net/CustomElementsExamples/4fq7wnt9
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 2021-08-10
    • 2014-03-04
    • 2016-07-15
    • 2019-10-07
    相关资源
    最近更新 更多