You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flowbite日期选择器更新Input后无法触发phx-change="validate"事件

问题:Flowbite日期选择器选中日期后Phoenix的phx-change事件未触发

当从Flowbite日期选择器中选择日期时,选中的日期会显示在日期输入框中,但绑定的phx-change="validate"事件并未触发。以下是相关代码:

core_component.ex

<input
  phx-hook="Datepicker"
  type="text"
  id={@id || @name}
  name={@name}
  value={@value}
  class={[
    "bg-gray-50 border pl-8 border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full ps-10 p-2.5  dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500",
    @class
  ]}
  {@rest}
  placeholder="Select date"
/>

app.js

Hooks.Datepicker = {
  mounted() {
      const datepickerEl = this.el;
      new Datepicker(datepickerEl, {
        autohide: true,
        buttons: true,
        format: 'yyyy-mm-dd',
      });
  },
  updated() {
      this.mounted();
  }
}

解决方案

问题出在Flowbite的Datepicker组件修改input值时,不会自动触发浏览器原生的input或change事件,而Phoenix的phx-change依赖这些原生事件触发回调。你需要在Datepicker的配置中添加onChange回调,手动触发对应的原生事件:

修改app.js中的Hook代码:

Hooks.Datepicker = {
  mounted() {
    const datepickerEl = this.el;
    new Datepicker(datepickerEl, {
      autohide: true,
      buttons: true,
      format: 'yyyy-mm-dd',
      // 添加onChange回调触发原生事件
      onChange: (selectedDate, datepicker) => {
        // 触发input事件(phx-change默认监听input事件,适合实时验证)
        datepickerEl.dispatchEvent(new Event('input', { bubbles: true }));
        // 若需在失去焦点时触发验证,可替换为change事件:
        // datepickerEl.dispatchEvent(new Event('change', { bubbles: true }));
      }
    });
  },
  updated() {
    this.mounted();
  }
}

关键说明

  • bubbles: true确保事件能向上冒泡,让Phoenix的事件监听器捕获到。
  • 优先使用input事件适配Phoenix默认的实时验证逻辑;若验证需在用户完成输入后触发,再选择change事件。

内容的提问来源于stack exchange,提问作者Jason O.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 17:07:15