Select2 小部件和 Pjax Yii2

Select2 Widget & Pjax Yii2

我正在尝试使用 Pjax(Yii2 中的内置 Ajax 组件)添加多个 Select2 widgets dynamically in the TabularForm。由于某种原因,Select2 输入呈现在视图顶部的错误位置(请参阅下面的 gif1)。据我所知,这个问题特别与 Select2 小部件有关,因为如果我使用一些默认组件,例如Html::a(参见下面的 gif2)。

gif1: https://i.imgur.com/YMh5dNb.gif

gif2: https://i.imgur.com/sJkTDkO.gif

如何摆脱 Select2 小部件的这种奇怪行为?谢谢提前!

控制器:

class ProfileController extends Controller
{
// ...
    public function actionCreate()
    {   
        if (Yii::$app->request->isAjax) { 
            // some logic here ...
            return $this->renderAjax('object/create', [
                // ...
            ]);
        }
    }
// ...

}

查看:

// ...
use kartik\select2\Select2;
use kartik\select2\Select2Asset;

Select2Asset::register($this);

// a bunch of html code

<?php Pjax::begin(['id' => 'product-add']); ?>
    $form1 = ActiveForm::begin();
    $attribs = [
        'name' => [
         'type' => TabularForm::INPUT_RAW,
          'value' => function($productModel) { 
               return Select2::widget([
                   'name' => 'state_10',
                   'data' => ['1' => '1', '2' => '2'],
                   'pjaxContainerId' => 'product-add',
                   'options' => [
                       'placeholder' => $productModel->tmpId,
                       'multiple' => true
                   ],
               ]);
               //return Html::a('product ' . $productModel->tmpId); <- works fine if I use this piece of code
           },
    ],

    // ...

    Html::a("Add", ['profile/create'], ['class' => 'btn btn-primary'])

    // ...
    <?php ActiveForm::end(); ?>
<?php Pjax::end(); ?>

// ...

经过仔细检查,我找到了解决方案。对于那些也将面临同样问题的人,您需要在 pjax 响应之前初始化您的小部件(在我的例子中是 Select2),例如在你的控制器中:

class ProfileController extends Controller
{
// ...
    public function actionCreate()
    {   
        if (Yii::$app->request->isAjax) { 
            // some logic here ...

            // initialize the widget with an appropriate id
            $this->view->registerJs("$({$product->tmpId}).select2();"); 

            return $this->renderAjax('object/create', [
                // ...
            ]);
        }
    }
// ...

}

在你的视图中的某处:

Select2::widget([
    'id' => $productModel->tmpId, // set your unique id here
    'name' => $productModel->tmpId,
    'data' => ['1' => '1', '2' => '2'],
    // ...
]);