Yii2 DropDownList Onchange更改自动完成Widget的“源”属性?

我已经试过这个: yii2依赖的自动填充小部件

但我不知道为什么它不工作。 这里我的脚本的HTML:

<?= $form->field($model, 'lbt_holder_type')->dropDownList(['prompt' => '--- Select Holder Type ---', 'S' => 'Student', 'E' => 'Employee'], ['onChange' => 'JS: var value = (this.value); if(value == "S"){$(#libraryborrowtransaction-name).autoComplete({source: '. $s_data.');} if(value == "E"){$(#libraryborrowtransaction-name).autoComplete({source: '. $e_data.');} '])?> 

自动完成:

 <?= $form->field($model, 'name')->widget(\yii\jui\AutoComplete::classname(), [ 'options' => ['class' => 'form-control', 'placeholder' => 'Enter Name/ID'], 'clientOptions' => [ 'source' => $s_data, 'autoFill' => true, 'minLength' => '1', 'select' => new yii\web\JsExpression("function( event, ui ) { $('#libraryborrowtransaction-lbt_holder_id').val(ui.item.id); }") ], ])?> 

我想根据dropdownlist的值更改自动完成源,如果S然后加载$ s_data其他加载$ e_data。 任何帮助。 谢谢。

这是我的数据,

 $s_data = (new \yii\db\Query()) ->select(["CONCAT(stu_unique_id,' - ',stu_first_name,' ',stu_last_name) as value","CONCAT(stu_unique_id,' - ',stu_first_name,' ',stu_last_name) as label","s_info.stu_info_stu_master_id as id"]) ->from('stu_master stu') ->join('join','stu_info s_info','s_info.stu_info_id = stu_master_stu_info_id') ->where('is_status = 0') ->all(); 

和,

 $e_data = (new \yii\db\Query()) ->select(["CONCAT(emp_unique_id, ' - ',emp_first_name,' ',emp_last_name) as value","info.emp_info_emp_master_id as id"]) ->from('emp_master emp') ->join('join', 'emp_info info', 'info.emp_info_id = emp_info_emp_master_id') ->where('is_status = 0') ->all(); 

那么,我已经将你的代码片段添加到我的testingyii2环境来testing什么是错误的。 所以你的代码有一些问题:

 [ 'onChange' => 'JS: var value = (this.value); if(value == "S"){$(#libraryborrowtransaction-name). autoComplete({source: '. $s_data.');} if(value == "E"){$(#libraryborrowtransaction-name). autoComplete({source: '. $e_data.');} '] 

首先我注意到你的“S”和“E”的引号符号应用了一些转义,而你在浏览器中的代码看起来像是&quot;S&quot;

接下来,jui自动完成插件将一个属性添加到名为"autocomplete"而不是"autoComplete" jquery原型中。 至于js是区分大小写的,这两个名字看起来不一样。

所以我的解决scheme是将所有js从onchange属性移动到单独的js脚本,如下所示(为了testing目的,您可以将它添加到您的yii视图文件中,您使用的代码在您的问题中提供)

 <script> function holderTypeChangeHandler(ev) { var value = (this.value); if(value == 'S'){ $('#libraryborrowtransaction-name').autocomplete({source: ' . $s_data . '}); } if(value == 'E'){ $('#libraryborrowtransaction-name').autocomplete({source: ' . $e_data . '}); } } window.onload = function(){ $('#libraryborrowtransaction-lbt_holder_type').on('change', holderTypeChangeHandler); }; </script> 

并将这个新事件处理程序的名称粘贴到您的dropdownList的onchange属性中,如下所示:

 ['onChange' => 'holderTypeChangeHandler'] 

更新:———————

由于基于JQuery UI自动填充小部件和Yii2自动完成的clientOptions Yii2自动完成包含JUI自动填充小部件的设置 ,因此我们可以参考JUI API文档以获取source选项的解释。 正如你所看到的,这个选项可以是一个string(在这种情况下,它被用作URI到JSON数据),一个函数或者一个js数组或者js数组。

在你的问题中,你正在使用\yii\db\Query在方法all()帮助下从db中获取一些数据,该方法返回一个数据数组。 所以最后你需要将你获得的数据数组转换成\yii\db\Query->all到js对象数组。 要做到这一点,使用php json函数 ,尤其是对于你的情况,你需要使用json_encode()函数:

 // Let's say this is a result of your query to db with use of `\yii\db\Query->...->all();` $some_array = [ [ "value" => "Val 1", "label" => "Label 1", "id" => 1 ], [ "value" => "Val 2", "label" => "Label 2", "id" => 2 ] ] // Just convert it to json string $s_data = json_encode($some_array); ... // When concat this json string as a value of source attribute for Yii Autocomplete $('#libraryborrowtransaction-name').autocomplete({source: <?= $s_data ?> }); 

如果您的$e_data相同。 只要注意,你从PHP获取你的数据的数据库,但使用JS,所以PHP数组需要被转换为string演示文稿js对象的数组,这种转换,你可以做json_encode