参考
几个月前我正在开发一个Yii2-formwizard 插件,当时我遇到了提供表格功能和克隆字段的情况,当涉及到使用Select2 和@ 等第3 方插件时,我真的很头疼987654324@ 我想出了以下代码以及许多其他代码(因为其他部分与您的问题无关,因此不要添加它)。
解决问题的方法
Kartik-select2 的工作方式是将 select2 插件特定的选项存储在您正在使用 select2 的元素的 data-krajee-select2 属性中。
并且主题或说 Kartik 的插件特定选项(例如 theme 和其他选项)保存在变量中,其名称保存在 data-s2-options 属性中。您可以在使用它的页面的视图源中查找它们。
解决方案
所以你需要做的是
步骤
由于您只是添加了一个字段,而不是另一个字段将更改谁的选择,我将演示一个示例,您可以使用 2 个不同的按钮将 select2 的行为从 multiple 更改为 single,单击在相关按钮上,select2 将相应地工作。您可以随意调整 javascript 代码。
但是在我添加任何需要修复一件事的代码之前,当您在plugin options 中使用ajax 选项时,您不需要主要的data 选项。换句话说,它对您的 select2 没有任何影响,并且只会增加页面加载时间,您应该将其删除。
您的 select2 应该如下所示,我在 select2 的 options 中添加了 id,例如,如果您愿意,可以将其更改为活动表单格式的名称,如 model-field_name 格式,但不要忘记也可以更改 javascript 代码中的 id
<?php echo $form->field($model, 'clubs')->widget(\kartik\widgets\Select2::classname(), [
'hideSearch' => false,
'options' => ['placeholder' => 'Add Club(s)','id'=>'clubs'],
'pluginOptions' => [
'allowClear' => true,
'multiple' => true,
'minimumInputLength' => 3,
'ajax' => [
'url' => 'web/index.php?r=clubs/clubslist',
'dataType' => 'json',
'data' => new JsExpression('function(params) { return {q:params.term}; }')
]
]
])->label('Club(s)');?>
在您的页面上添加以下按钮
echo Html::button('multiple', ['class' => 'btn btn-info', 'id' => 'multi']);
echo Html::button('single', ['class' => 'btn btn-info', 'id' => 'single']);
现在神奇的东西,将它添加到您的视图顶部
$js = <<<JS
var element=$("#clubs");
$('#multi').on('click',function(e){
//reset select2 values if previously selected
element.val(null).trigger('change');
//get plugin options
let dataSelect = eval(element.data('krajee-select2'));
//get kartik-select2 options
let krajeeOptions = element.data('s2-options');
//add your options
dataSelect.multiple=true;
//apply select2 options and load select2 again
$.when(element.select2(dataSelect)).done(initS2Loading("clubs", krajeeOptions));
});
$('#single').on('click',function(e){
element.val(null).trigger('change');
let dataSelect = eval(element.data('krajee-select2'));
let krajeeOptions = element.data('s2-options');
dataSelect.multiple=false;
$.when(element.select2(dataSelect)).done(initS2Loading("clubs", krajeeOptions));
});
JS;
$this->registerJs($js, \yii\web\View::POS_READY);
现在,如果您的 select2 工作正常,请单击 multiple 按钮,您将看到 select2 启用了多项选择,并且在单击 single 按钮时。
希望对你有帮助。