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

如何通过turbo_stream填充intl-tel-input字段并自动匹配国旗?

解决intl-tel-input国旗未自动更新的问题

问题出在Turbo Stream仅修改了输入框的value属性,但intl-tel-input组件无法感知到这个非用户触发的数值变化,因此不会自动匹配对应国家的国旗。需要手动调用组件的API来同步号码与国旗状态。

方案一:通过Turbo Stream调用Stimulus方法更新组件

1. 修改Turbo Stream代码

在设置输入框值的同时,调用Stimulus控制器的方法来更新intl-tel-input:

= turbo_stream.set_value '#phone_field', @contact.phone_number 
= turbo_stream.invoke 'phone_number#updateNumber', args: { number: @contact.phone_number }

2. 扩展Stimulus控制器

添加一个updateNumber方法,直接调用intl-tel-input的setNumber API同步号码与国旗:

import { Controller } from "@hotwired/stimulus"
import intlTelInput from 'intl-tel-input';

export default class extends Controller {
  static targets = ['input']

  connect() {
    this.iti = intlTelInput(this.inputTarget, {
      utilsScript: "/assets/utils.js",
      strictMode: true,
      countryOrder: ["BR", "PT", "ST", "CV", "LU", "FR", "GB"]
    });

    const formElement = this.inputTarget.closest("form");
    if (formElement) {
      formElement.addEventListener("submit", (event) => {
        this.inputTarget.value = this.iti.getNumber();
      });
    }
  }

  // 新增方法:更新号码并同步国旗
  updateNumber({ number }) {
    this.iti.setNumber(number);
  }
}

方案二:监听Turbo渲染事件自动同步

如果不想修改Turbo Stream,可以在Stimulus控制器中监听Turbo的渲染完成事件,自动检测输入框值并更新组件:

connect() {
  // 原有的初始化代码...

  // 监听Turbo页面渲染/更新事件
  document.addEventListener('turbo:render', () => {
    const currentValue = this.inputTarget.value;
    if (currentValue) {
      this.iti.setNumber(currentValue);
    }
  });
}

原理说明

intl-tel-input组件仅对用户手动输入或通过自身API修改的号码进行国家匹配。通过Turbo Stream直接修改input的value属于DOM属性变更,组件不会主动监听这类变化,因此必须手动调用setNumber方法触发国旗更新。

内容的提问来源于stack exchange,提问作者Hector Guarçoni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:05:01