【问题标题】:Ajax with bootstrap.TbSelect2 (Yii)Ajax 与 bootstrap.TbSelect2 (Yii)
【发布时间】:2013-08-29 12:14:01
【问题描述】:

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

【问题讨论】:

    标签: php jquery ajax twitter-bootstrap yii


    【解决方案1】:

    我知道这已经过时了,但是您是否尝试过以下方法来使 Ajax 后渲染正常工作。

    // Notice the ,false, true at the end of renderpartial
    $this->renderPartial("_townsselect", array('country'=>$country), false, true);
    

    【讨论】:

    • 您好,刚刚注意到您的评论。现在在一个新项目上,在谷歌上找到了我自己的问题哈哈。对于最后一个项目,我坚持使用我想出的解决方案。我已经尝试过您提到的解决方案,但它导致脚本冲突并破坏了主题。我的解决方案不适用于这个新项目,因为我试图通过 ajax 加载整个选择
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多