php - 如何在 yii2 中动态加载内容中加载小部件?

标签 php jquery ajax yii2 widget

我每次在某些点击事件上都会加载整个模式内容。由于我在模态上显示的内容取决于 id,因此它是完全动态的。我在动态内容中使用了几个小部件。像 kartik select2 和其他几个。但它没有加载该小部件资源。然后我尝试手动加载资源,但仍然缺少一些通常会加载的js文件。事件ajax表单提交也不起作用。下面是我的观点的代码。

<?php

use yii\widgets\ActiveForm;
use yii\bootstrap\Modal;
use yii\helpers\ArrayHelper;
use admin\models\Applicant;
use yii\helpers\Html;
use kartik\widgets\Select2;
use yii\helpers\Url;

Modal::begin([

    'header' => '<h1>Assign Applicant</h1>',
    'options' => [
        'id' => 'assignApplicantModal',
        'tabindex' => false
    ],
]);
?>

<div class="job-positions-form">

    <?php
    $form = ActiveForm::begin([
                'id' => 'assign_applicant_frm',
                'action' => Url::to(['scheduler/assign_applicant/' . $id]),
                'enableClientValidation' => true,
                'enableAjaxValidation' => true,
                'validationUrl' => Url::toRoute(['scheduler/validation-assign-applicant']),
                'validateOnSubmit' => true,]);
    ?>
    <div class="row">
        <div class="col-sm-12">
            <?php
            $data = ArrayHelper::map(Applicant::find()->where('status = :status', [':status' => 'Active'])->all(), 'id', function($model) {
                        return $model->first_name . ' ' . $model->last_name;
                    });

            echo $form->field($assign_model, 'applicant_id')->widget(Select2::classname(), [
                'data' => $data,
                'attribute' => 'applicant_id',
                'options' => ['placeholder' => 'Select an applicant', 'multiple' => 'multiple', 'style' => "width:100%"],
                'pluginEvents' => [
                    "select2:selecting" => "function() { "
                    . "no_position = $('body').data('no_position');"
                    . "if(no_position>= " . $model->no_of_persons . "){alert('You can select only " . $model->no_of_persons . " applicant(s)');return false;}  }",
                    "select2:select" => "function() { "
                    . "no_position = $('body').data('no_position');"
                    . "$('body').data('no_position',++no_position);}",
                    "select2:unselect" => "function() { "
                    . "no_position = $('body').data('no_position');"
                    . "$('body').data('no_position',--no_position);}",
                ]
            ]);
            ?>
        </div>
        <div class="col-sm-12">
            <?php echo $form->field($assign_model, 'applicant_pay')->textInput(['maxlength' => true]); ?>
        </div>

        <div class="form-group" style="text-align: center;">
            <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary', 'id' => 'assign_save_btn']) ?>
        </div>
    </div>
    <?php ActiveForm::end(); ?>
</div>
<?php
$inlineScript = "$('body').data('no_position'," . count($applicant_id) . ")";
$this->registerJs($inlineScript, \yii\web\View::POS_END, 'my-inline-js');
Modal::end();

最佳答案

造成这种情况的原因可能有几个。

最明显的一个(这是你的情况)是,如果你使用renderPartial()而不是renderAjax(),就会发生这种情况。他们都做同样的事情,但有一点不同:

renderPartial() 不加载资源(css、js)。然而,renderAjax() 确实加载了资源。它是为通过 ajax 部分加载页面的用例而设计的。

可能发生的第二点是当 Assets 通过 Pjax 使用某些旧版本的 bower\yii2-pjax (<=2.0.5) 加载时。你可以在这个here上找到答案。对于 2.0.6+,您应该不会遇到问题。

关于php - 如何在 yii2 中动态加载内容中加载小部件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39736645/

相关文章:

javascript - 如何让页面点击下滑而不刷新

ajax - 拦截器和 transformResponse 之间的确切区别是什么?

php - 无法从 PHP 访问 ubuntu 的环境变量

php - 我无法使用 Postgres 和 PHP 插入数据

php - JQuery Ajax 使用预定义的 id 执行 php 脚本

javascript - 如何在 javascript 中创建自定义命名空间或类

javascript - 如何从 AngularJS Controller 将值设置为 AngularJS 常量文件

php - 如何让我的 Wordpress 插件接收数据并将其在 ajax/php 请求中中继到需要身份验证的远程服务器?

php - 在 CakePHP 和 Postfix 中处理电子邮件退回

javascript - 修改兴趣点,让所有点/气球首先打开,然后能够单独关闭和再次打开