2016-09-28 3 views
1

일부 클릭 이벤트에서 매번 모달 콘텐츠 전체를로드합니다. 모달에 표시 할 내 콘텐츠는 ID에 따라 다르므로 완전히 동적입니다. 나는 동적 인 내용에있는 몇몇 도구를 사용하고있다. kartik select2 및 기타 여러 가지가 있습니다. 그러나 위젯 자산을로드하지 않습니다. 그런 다음 애셋을 수동으로로드하려고 시도했지만 정상적으로로드 될 일부 js 파일을 놓친다. 이벤트 아약스 양식 제출도 작동하지 않습니다. 아래는 내 견해의 코드입니다.yii2에서 동적으로로드 된 컨텐츠에서 위젯을로드하는 방법은 무엇입니까?

<?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(); 
+0

여기에는 여러 가지 것들이있을 수 있습니다. 어떻게 모달에서 html을 렌더링하고 있습니까? 컨트롤러 액션에서'renderAjax()'를 사용하고 있습니까? 이렇게하면 모달에 적절한 자산을로드하는 데 도움이됩니다. 또한 Pjax를 사용하고 있습니까? 그렇다면 yiisoft/Pjax의 어떤 버전을 실행하고 있습니까? 최신 버전에서 몇 가지 중요한 변경 사항이있었습니다. –

+0

@ D.Mill 나는 renderPartial을 사용하고 있습니다. 나는 Pjax – Ish

+3

을 사용하지 않고'renderAjax'를 사용하려고합니다. 대신'renderPartial'은 같은 방식으로 애셋을로드하지 않습니다. –

답변

3

여기에는 몇 가지 이유가있을 수 있습니다.

renderAjax() 대신 renderPartial()을 사용하면 가장 분명합니다 (사용자의 경우). 둘 다 하나의 차이점을 가지고 동일한 작업을 수행합니다.

renderPartial() 애셋 (css, js)을로드하지 않습니다. 그러나 renderAjax()은 자산을로드합니다. 페이지가 부분적으로 아약스를 통해로드 된 사용 사례를 위해 설계되었습니다.

애셋이 Pjax를 통해 bower\yii2-pjax (< = 2.0.5)의 일부 구버전과 함께로드 될 때 발생할 수있는 두 번째 사항이 있습니다. 이 here에 대한 답변을 찾을 수 있습니다. 2.0.6 이상에서는 문제가 발생하지 않아야합니다.

관련 문제