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

Livewire中wire:model无法捕获自动补全选中值的问题求助

问题:jQuery UI Autocomplete选中结果后,Livewire绑定值未同步更新

我实现了带自动补全功能的搜索输入框,前端展示正常,但用户输入“anc”并选中结果“anchorage”后,调用Livewire的addBusinessData方法时,dd($search_towns)输出的仍是“anc”,而非选中的“anchorage”。

相关代码

AJAX/自动补全JS代码

$.ajax({
    method: "GET",
    url: "/searchcity",
    success: function (response) {
      townsTags = response;
      startAutocomplete(townsTags, "#search_towns");
    }
  });

  function startAutocomplete(availableTags, inputSelector) {
    $(inputSelector).autocomplete({
      source: availableTags
    });
  }

Livewire类代码片段

public $search_towns;

public function addBusinessData(){
   dd($this->search_towns);
}

Livewire组件视图代码

<form wire:submit.prevent="addBusinessData">
  <div class="col">
    <input class="form-control" type="search" wire:model="search_towns" 
    id="search_towns" name= "search_towns" autocomplete="off" 
    placeholder="Select City/Town "/>
   <span class="text-danger">@error('search_towns'){{ $message }}@enderror</span>
 </div>
  <input type="submit" class="btn btn-primary m-4">
</form>

解决方法

问题出在jQuery UI Autocomplete选中结果时,仅修改了输入框的DOM值,但没有触发Livewirewire:model监听的同步事件。需要在Autocomplete的select回调中手动触发事件,通知Livewire更新绑定值。

修改startAutocomplete函数,添加select事件处理:

function startAutocomplete(availableTags, inputSelector) {
  $(inputSelector).autocomplete({
    source: availableTags,
    select: function(event, ui) {
      // 将输入框值设置为选中的完整结果
      $(this).val(ui.item.value);
      // 触发input事件,让Livewire同步更新$search_towns
      $(this).trigger('input');
      // 阻止默认行为,避免Autocomplete的默认处理干扰
      return false;
    }
  });
}

原因说明

Livewire的wire:model默认通过监听输入框的input、change等事件来同步前端值到后端属性。而jQuery UI Autocomplete的select事件修改输入框值后,不会自动触发这些同步事件,所以需要手动调用trigger('input')来触发Livewire的同步逻辑,确保后端$search_towns能获取到选中的完整值。

内容的提问来源于stack exchange,提问作者Hotdot Cyber

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:27:33