在onchange函数内设置元素data属性,select2请求不识别新值如何解决?
问题原因
你遇到的现象和作用域没有关系,核心是tetranz/select2entity-bundle的运行机制导致的:
- 组件初始化时只会读取一次元素上的
query-parameters值,存入自身的内部配置中使用 - 页面加载时你修改
data()的操作发生在组件初始化之前,所以修改后的值会被组件正常读取,请求生效 - onchange触发时组件已经初始化完成,你通过jQuery的
data()方法修改的只是jQuery单独维护的内存缓存,和select2已经加载完成的配置是完全独立的两个存储,组件不会主动重新读取新的data值,所以请求始终携带的是初始化时的旧值
可行解决方法
方案一:直接修改select2实例的AJAX参数(推荐,无需重绘组件)
直接操作已经初始化的select2实例配置,更新请求参数:
$('#another_element').change(function () { const dynamicVal = $(this).val(); // 取另一个输入框的最新值 // 拿到select2实例 const select2Ins = $('#my_element').data('select2'); // 更新AJAX请求的参数逻辑 select2Ins.options.get('ajax').data = function (params) { return { q: params.term, // select2默认的搜索参数 var: dynamicVal // 你的动态参数 }; }; // 触发select2刷新请求 $('#my_element').val(null).trigger('change'); });
方案二:修改参数后重新初始化select2组件
修改data值后销毁原有组件实例,重新初始化时会自动读取最新的data参数:
function changeQueryParams(text) { const $ele = $('#my_element'); $ele.data('query-parameters', {'var': text}); // 销毁旧实例 $ele.select2('destroy'); // 重新初始化,tetranz/select2entity-bundle会自动读取新的参数 $ele.select2entity(); }
补充说明
如果你需要修改DOM上的实际data-query-parameters属性,可以用attr('data-query-parameters', 新值)的方式操作,不过该操作对已经初始化完成的select2组件不会生效,只有组件初始化阶段才会读取DOM上的data属性。
内容的提问来源于stack exchange,提问作者Select0r
相关产品推荐
相关产品推荐

