[英]Ajax with bootstrap.TbSelect2 (Yii)
我有一个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 '
正常加载页面后,它还将运行先前手动设置为$ country的默认renderPartial。
因此,它两次都调用相同的代码。 但是,在页面加载时,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代码以清除“选择”中的所有选项,并用新列表重新填充它。 新列表来自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));
});
我将其放在此处,以防其他人尝试达成类似的目标。
但是我仍然有兴趣知道为什么在ajax渲染后yiibooster / bootstrap不起作用。 并且,如果有一种方法可以使它起作用,那么除非首先在页面加载时呈现输入,否则此解决方案将不起作用。
我知道这很旧,但是您是否尝试过以下方法来使Ajax渲染工作正常。
// Notice the ,false, true at the end of renderpartial
$this->renderPartial("_townsselect", array('country'=>$country), false, true);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.