2016-09-28 26 views
1

私はモーダルコンテンツ全体をいくつかのクリックイベントで毎回読み込んでいます。モーダルに表示されるコンテンツはIDに依存するため、完全に動的です。私は動的コンテンツにいくつかのウィジェットを使用しています。 kartik select2や他のいくつかのように。しかし、そのウィジェット資産を読み込んでいません。その後、私は手動で資産を読み込もうとしましたが、通常はロードされるjsファイルがありません。イベントajaxフォームの提出も機能していません。以下は私の見解のコードです。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'が同じ方法でアセットを読み込まないので代わりに 'renderAjax'を使ってみてください。 –

答えて

3

これにはいくつかの理由が考えられます。

renderAjax()の代わりにrenderPartial()を使用すると、最も明白なのはこの場合です。どちらも同じ違いを持っ​​て同じことをします。

renderPartial()アセット(css、js)を読み込みません。しかし、renderAjax()は資産を読み込みます。これは、ページが部分的にajax経由でロードされたユースケース用に設計されています。

アセットがPjax経由で読み込まれ、古いバージョンのbower\yii2-pjax(< = 2.0.5)が使用される場合があります。このhereについての回答を見つけることができます。 2.0.6以上では問題は発生しません。

関連する問題