0

我有一个 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 之后渲染时不起作用。如果有办法让它工作,因为这个解决方案不会工作,除非输入首先在页面加载时呈现。

4

1 回答 1

0

我知道这很旧,但是您是否尝试过以下方法来使 Ajax 渲染后的工作正常工作。

// Notice the ,false, true at the end of renderpartial
$this->renderPartial("_townsselect", array('country'=>$country), false, true);
于 2014-01-06T16:55:15.780 回答