【问题标题】:Kartik select2 widget not working in Ajax request in Yii2?Kartik select2 小部件在 Yii2 的 Ajax 请求中不起作用?
【发布时间】:2016-09-22 07:28:51
【问题描述】:

我在我的 yii2 基本应用程序中使用了 kartik select2 小部件。现在我必须在 ajax 调用时在 select2 小部件中显示省份名称。如果我直接把它放在表格中,它工作得很好。但是不能使用 ajax 调用。

这是我的表单域:

<?= $form->field($model, 'role')->dropDownList(
    ArrayHelper::map(SubAdminRoles::find()->all(), 'id', 'role_name'),
    [
        'prompt' => 'Select Role',
        'onchange' => '
            if($(this).val() != 3) {
                $( "#user_area" ).html("showLoading");
                $.post( "fetch-area-list?id='.'"+$(this).val(), 
                function(data) {
                    $( "#user_area" ).html(data);
                })
            }'
    ]
    ) ?>

 <div id="user_area">

</div>

这是我的操作代码

public function actionFetchAreaList($id) {
   // $this->layout = 'none';
    $data = [];
    if($id == 1) {
        $provinceList = \app\modules\adminpanel\models\ProvinceMaster::findAll(['status' => 1, 'is_deleted' => 0]);

        foreach($provinceList as $obj) {
            $data[$obj['id']] = $obj['province_name'];
        }
        //print_r($data);
        //exit;
    } else if($id == 2) {
        $subDistrictList = \app\modules\adminpanel\models\SubDistrictMaster::findAll(['status' => 1, 'is_deleted' => 0]);

        foreach($subDistrictList as $obj) {
            $data[$obj['id']] = $obj['sub_district_name'];
        }
    }

    echo '<label class="control-label">Select Province</label>';
    echo Select2::widget([
        'name' => 'state_2',
        'value' => '1',
        'data' => $data,
        'options' => ['multiple' => true, 'placeholder' => 'Select Province']
    ]);
    exit;
}

现在当我尝试通过 ajax 获取它时,我带有 display:none 属性,所以我无法显示我的 select2 框。

我还尝试在 select2 类中将 display:none 更改为 display:block。在那种情况下,我得到了选择框,但是简单的 html 多选框不是 select2 小部件。

如何使用 ajax 调用从控制器获取它?

提前致谢。

【问题讨论】:

    标签: php yii2 yii2-basic-app yii2-widget


    【解决方案1】:

    在 action 中渲染 html 是不好的做法。 在您的情况下,小部件需要相关的 JS 进行初始化。但它不会包含在您的回复中。 移动所有 html 以查看 area-list 并使用以下代码呈现:

    public function actionFetchAreaList($id) {
        $this->layout = false;
    
        // ... preparing data
    
        return $this->renderAjax('area-list', [
            // ... some view data
        ]);
    }
    

    方法renderAjax 呈现一个命名视图并注入所有注册的JS/CSS 脚本和文件。它通常用于响应 AJAX Web 请求。

    【讨论】:

    • 谢谢,但我已经尝试过了。它会将我重定向到区域列表操作
    • 此代码不应重定向到任何页面。可能 ajax 响应包含一些 js 错误。在启用的“保留日志”选项中使用浏览器控制台对其进行调试。它可以防止在重定向后刷新控制台输出
    【解决方案2】:

    我也有类似的项目。 我有 2 个组合框(使用 select2)。从第一个组合框中选择一个地区时。它将调用 ajax 请求来获取省份列表并填写到第二个组合框。 这是我的解决方案:

    1. 在表单中正常使用 Select2 小部件
    2. 使用javascript调用ajax请求并更改第二个组合框的数据。 我的控制器响应数据为 json 格式。

      $('#district-selector').on('change', function() {
          var districtId = $(this).val();
          var url = $(this).attr('tb_href');
          $('#province-selector').html('');
          $.get(
              url,
              {
                  city_id: districtId
              },
              function(response) {
                  if (response.error == 0 && response.data.length) {
                      $('#province-selector').append(new Option('', ''));
                      $.each(response.data, function() {
                          console.log(this.id + '--' + this.title);
                          var newOption = new Option(this.title, this.id);
                          $('#province-selector').append(newOption);
                      });
                  }
                  $('#province-selector').trigger('change');
              }
          );
      });
      

    演示:demo link

    【讨论】:

      猜你喜欢
      • 2016-07-14
      • 1970-01-01
      • 2017-01-31
      • 2017-08-15
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      • 1970-01-01
      • 2014-12-28
      相关资源
      最近更新 更多