【发布时间】:2020-12-20 00:23:47
【问题描述】:
我希望实现两件事:
-
允许选择选项可搜索和可过滤。
-
如果给定选项只有 1 个,则自动选择值
下面的代码实现了我的第 1 点,但我不确定根据当前的实现如何实现我的第 2 点。选择一个值会添加到args,因此当一个 select2 打开时,它会使用更新的args 查询数据库并返回过滤选项针对特定的 select2。工作版本如下所示:
jQuery( 'document' ).ready( function( $ ) {
let select2s = [];
let args = {};
/**
* Clear select2 values
*/
function clear_select2s( except_name ) {
except_name = ( 'undefined' !== typeof except_name ) ? except_name : '';
select2s.forEach( function( $select2, key ) {
if( $select2.attr( 'name' ) == except_name ) { return; }
$select2.val( '' );
} );
}
/**
* Initialize select2s
*/
$( '#s2Container .select2' ).each( function() {
let name = $( this ).attr( 'name' );
let placeholder = $( this ).attr( 'placeholder' );
let $select2 = $( this ).select2( {
allowClear: true,
placeholder: placeholder,
ajax: {
type: 'post',
url: test.ajaxurl,
dataType: 'json',
data: function( params ) {
return {
action: 'select2_filtering',
return: name,
args: Object.assign( args, {
'search': params.term
} ),
};
},
processResults: function( response ) {
return {results: response.data.options};
},
},
} );
/* Push select into Array */
select2s.push( $select2 );
} );
/**
* Remove selected value from arguments
*/
$( '#s2Container .select2' ).on( 'select2:unselecting', function() {
let name = $( this ).attr( 'name' );
args[ name ] = '';
clear_select2s();
} );
/**
* Add selected value to arguments
*/
$( '#s2Container .select2' ).on( 'select2:select', function() {
let name = $( this ).attr( 'name' );
let value = $( this ).val();
Object.assign( args, {[name]:value} );
clear_select2s( name );
} );
} );
HTML
<div id="s2Container">
<select class="select2" name="product_id" placeholder="Select Product"></select>
<select class="select2" name="category_id" placeholder="Select Category"></select>
<select class="select2" name="brand_id" placeholder="Select Brand"></select>
</div>
上面的代码通过 ajax 过滤了选择选项,太好了。问题是我的返回只返回当前select2的选项。
如果我为所有选择返回 all 选项的数据,那么我的理解是我需要完全重建每个 select2。销毁和重建 select2 然后失去 ajax 功能。在processResults 内执行所有这些操作似乎有缺陷,我不确定更好的方法。
如果我将其分解为 2 个 ajax 调用,一个用于 select2 选项的初始加载,一个用于处理 on( 'select2:select' ),那么我最终会得到比我需要的更多的 ajax 调用,并且我的 select2:select ajax 被覆盖最初的 select2 实例 ajax。
动态填充多个 select2 选项的最佳方法是什么?如果返回的选项计数仅为 1,我将如何设置选定的值?
【问题讨论】:
-
我很熟悉这个关于chaining select2s 的类似问题,但它非常笼统,并没有真正回答我的任何问题。它不像范围那么简单,我的选择器是通用的并且没有 ID。
标签: javascript jquery ajax jquery-select2