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

Choices.js报错:Cannot read properties of undefined (reading 'removeLoadingState') 求助

解决Choices组件AJAX更新时的"Cannot read properties of undefined (reading 'removeLoadingState')"报错

问题根源

你在AJAX请求的success回调里重复创建了Choices实例——初始页面渲染时该组件已经完成初始化,重复绑定同一个DOM元素会导致内部状态混乱,触发removeLoadingState读取undefined的报错。

修复方案

1. 全局保存Choices实例(页面初始化时创建)

把Choices实例的初始化移到页面加载完成时执行,并保存为全局变量,避免重复创建:

let memberChoicesInstance;

$(document).ready(function() {
    // 初始化Choices组件并保存实例
    memberChoicesInstance = new Choices(document.getElementById('member_id'), {
        searchEnabled: true,
        placeholderValue: "{{ __('Select a Member') }}"
    });
});

2. 修改AJAX回调逻辑,复用已有的实例

在success回调里直接用全局实例更新选项,而不是重新创建:

$("#createFemberForm").submit(function(event) {
    event.preventDefault();
    var formData = new FormData(this);
    
    $.ajax({
        method: "POST",
        url: '{{ route('members.ajax.store') }}',
        data: formData,
        dataType: "json",
        contentType: false,
        processData: false,
        success: function(response) {
            // 清空现有选项
            memberChoicesInstance.clearChoices();
            
            // 构造新选项数组
            const newChoices = [];
            for (const memberId in response.members) {
                if (response.members.hasOwnProperty(memberId)) {
                    newChoices.push({
                        value: memberId,
                        label: response.members[memberId]
                    });
                }
            }
            
            // 加载新选项(最后一个参数false表示不保留旧选项)
            memberChoicesInstance.setChoices(newChoices, 'value', 'label', false);
            
            // 设置选中刚创建的成员
            memberChoicesInstance.setValue([{ value: response.member_id }]);
            
            // 关闭模态框
            memberModal.style.display = 'none';
        }
    });
});

3. 优化Blade模板(可选)

将HTML属性里的searchEnabled等配置移到JS初始化参数后,可以移除冗余的HTML属性:

{{ Form::select('member_id', $members, null, ['class' => 'form-control choices', 'placeholder' => __('Select a Member')]) }}

关键说明

  • 同一个DOM元素只能绑定一个Choices实例,重复创建会导致内部状态冲突
  • 使用clearChoices()清空旧选项后,再用setChoices()加载新数据,避免新旧选项混杂
  • setValue()方法需要传入包含value的对象数组,比setValueByChoice更稳定

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 02:42:44