将 Select2 选项显示为已选择

Posted

技术标签:

【中文标题】将 Select2 选项显示为已选择【英文标题】:Show Select2 option as selected 【发布时间】:2018-07-11 17:35:06 【问题描述】:
 <?=
$form->field($model, 'contributors')->widget(Select2::classname(), [
    'initValueText' => '',
    'options' => ['placeholder' => 'Search for a Contributor ...'],
    'pluginOptions' => [
        'allowClear' => true,
        'minimumInputLength' => 3,
        'ajax' => [
            'url' => \yii\helpers\Url::to(['data2']),
            'dataType' => 'json',
            'data' => new JsExpression('function(params)  return q:params.term; ')
        ],
        'escapeMarkup' => new JsExpression('function (markup)  return markup; '),
        'templateResult' => new JsExpression('function(contributor_id)  return contributor_id.text; '),
        'templateSelection' => new JsExpression('function (contributor_id)  return contributor_id.text; '),
    ],
])->label('Contributors');
?>

如何显示选定的值,现在它显示 id 为选定的。 请任何人帮助我。

【问题讨论】:

【参考方案1】:

更新

抱歉,回复晚了没有注意到您需要为 select2 设置初始文本,因为您正在使用 ajax 选项,因此您应该使用选项initValueText。根据文档

initValueText : 在 Select2 小部件中显示的文本 初始值。这在您使用 带有 ajax 加载数据的小部件和/或您没有提供数据。 查看 ajax 使用部分以获取示例。

所以你需要像下面这样使用它,在你的控制器动作中添加这一行并将它传递给视图,或者在 select2 之前添加它到视图中

$contributorName = empty($model->contributors) ? '' : Contributors::findOne($model->contributors)->name;

<?=
$form->field($model, 'contributors')->widget(Select2::classname(), [
    'initValueText' => $contributorName, // set the initial display text
    'options' => ['placeholder' => 'Search for a Contributor ...'],
     'data'=>yii\helpers\ArrayHelper::map(Contributors::find()->all(),'id','name')
    'pluginOptions' => [
        'allowClear' => true,
        'minimumInputLength' => 3,
        'ajax' => [
            'url' => \yii\helpers\Url::to(['data2']),
            'dataType' => 'json',
            'data' => new JsExpression('function(params)  return q:params.term; ')
        ],
        'escapeMarkup' => new JsExpression('function (markup)  return markup; '),
        'templateResult' => new JsExpression('function(contributor_id)  return contributor_id.text; '),
        'templateSelection' => new JsExpression('function (contributor_id)  return contributor_id.text; '),
    ],
])->label('Contributors');
?>

您需要为将显示所选值的值集提供数据选项您希望显示text 而不是id,请以数组形式提供data 选项与key=&gt;value 对。

查看您的代码,您希望在数据库表中针对id 显示贡献者name,因此您应该使用ArrayHelper:map() 以及查询您的Contributors 模型,请参见下文并更新您的字段名称为@ 987654335@ArrayHelper::map()内的模型/表

<?=
$form->field($model, 'contributors')->widget(Select2::classname(), [
    'options' => ['placeholder' => 'Search for a Contributor ...'],
     'data'=>yii\helpers\ArrayHelper::map(Contributors::find()->all(),'id','name')
    'pluginOptions' => [
        'allowClear' => true,
        'minimumInputLength' => 3,
        'ajax' => [
            'url' => \yii\helpers\Url::to(['data2']),
            'dataType' => 'json',
            'data' => new JsExpression('function(params)  return q:params.term; ')
        ],
        'escapeMarkup' => new JsExpression('function (markup)  return markup; '),
        'templateResult' => new JsExpression('function(contributor_id)  return contributor_id.text; '),
        'templateSelection' => new JsExpression('function (contributor_id)  return contributor_id.text; '),
    ],
])->label('Contributors');
?>

【讨论】:

感谢您的宝贵回复,但为什么我在使用 ajax 作为贡献者时使用数据并在用户输入时附加到其中。顺便说一句,我尝试过这个解决方案但没有用。 它在您的情况下不起作用,因为您在 pluginOptions 内提供了 data,它覆盖了在小部件级别设置的 data @Nageen 你也应该使用processResults 抱歉@Nageen 没有注意到,更新了我的回答希望对您有帮助

以上是关于将 Select2 选项显示为已选择的主要内容,如果未能解决你的问题,请参考以下文章

在与下拉列表分开的输入中显示 select2“药盒”

使用多项选择 select2 选择后立即显示选择的选项数量

Select2 4.0.0 AJAX - 使用 Tab 选择突出显示的选项

Select2 4.0.0 AJAX - 使用Tab选择突出显示的选项

将 select2 显示为纯输入文本

select2 - 单击时未选择下拉选项