我有一个 Select,当另一个 Select 改变时,它的内容也会改变。在更改时,ajax 在我的控制器中运行一个函数来执行此操作:
$this->renderPartial("_townsselect", array('country'=>$country));
它从 $_GET 获得 $country。
_townselect.php
$towns= $this->townsselect($country);
$this->widget('bootstrap.widgets.TbSelect2', array(
'name'=>'clienttown',
'asDropDownList' => true,
'data' => $towns
));
townsselect() 创建一个数组,结构如下: $towns[ town-id ]=' TownName '
当页面正常加载时,它还会运行先前的 renderPartial,并将 $country 手动设置为默认值。
所以它两次调用相同的代码。然而,在页面加载时,Tbselect2 显示正确(正确的样式,包括为其提供搜索框的 js 支持等),但是当我使用 ajax 时,标准 Select 使用有限的样式。实际上产生的代码是不同的:
页面加载后的结果
<div class="select2-container" id="s2id_clienttown" style="width: 220px">
<a href="#" onclick="return false;" class="select2-choice" tabindex="-1">
<span>Accrington</span>
<abbr class="select2-search-choice-close" style="display:none;"></abbr>
<div>
<b></b>
</div>
</a>
<div class="select2-drop select2-with-searchbox select2-drop-active select2-offscreen" style="display: block;">
<div class="select2-search">
<input type="text" autocomplete="off" class="select2-input" tabindex="-1">
</div>
<ul class="select2-results"></ul>
</div>
</div>
<select name="clienttown" id="clienttown" style="display: none;">
<option value="Select">Select</option>
...
</select>
</div>
在 ajax 之后只生成 Select 。
临时解决方案
我设法让它以某种形式工作。我没有重新创建整个选择框,而是更改了 JQuery 代码以清除 Select 中的所有选项并用新列表重新填充它。新列表来自 ajax 返回的 JSON 字符串。处理如下:
var towns = $.parseJSON(resp);
$('#clienttown option:gt(0)').remove(); //remove all options, but leave default 'Select A Town' option
var sel = $('#clienttown');
$.each(towns, function(id, town){
sel.append($("<option></option>").attr("value", id).text(town));
});
我把它放在这里以防它帮助其他人尝试实现类似的事情。
但是,我仍然想知道为什么 yiibooster/bootstrap 在 ajax 之后渲染时不起作用。如果有办法让它工作,因为这个解决方案不会工作,除非输入首先在页面加载时呈现。