33

ビュー内に JavaScript を追加すると、ReferenceError: $ is not defined. この問題は、私のページの最後に Yii2 がスクリプトを挿入することが原因であると想定しています。これを修正する方法は?

または、どうすれば Yii2 がスクリプト ファイルを自動ロードしないようにできますか?

私の見解

  <?php

   use yii\helpers\Html;
   use yii\helpers\ArrayHelper;
   use yii\helpers\UrlManager;
   use yii\widgets\ActiveForm;
   use backend\controllers\StandardController;

   use backend\models\standard;


   ?>

 <div class="domain-form">

<?php $form = ActiveForm::begin(); ?>

<?php



    <?= $form->field($model, 'clause')->textarea(['rows' => 6]) ?>

    <?= $form->field($model, 'name')->textarea(['rows' => 6]) ?>

    <div class="form-group">
        <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
    </div>

<?php ActiveForm::end(); ?>

   </div>

    <script type="text/javascript">
    $("document").ready( function () {
    alert("hi");
    });</script>

ページが読み込まれた後にアラートを表示するには、この単純なスクリプトを取得する必要があります。ここでスクリプトファイルを呼び出していないのは、yii を呼び出してレイアウトに自動的にロードする (と思う) からです。

  AppAsset::register($this);

これにより、カスタム スクリプトの後に、ページの最後にスクリプト ファイルが登録されます。

これを解決するには?

4

2 に答える 2

90

Yii2 はスクリプト (jquery など) をページの最後に挿入します。これは意図されたものであり、望ましいものです。ただし、これはスクリプトの後に jQuery がロードされることを意味するため、スクリプトを実行した時点では jQuery はまだ存在していません。

簡単なテストを行う最も簡単な方法は、yii スクリプト (jquery など) をページの先頭に移動することです。これを変更assets\AppAsset.phpして追加します。

public $jsOptions = array(
    'position' => \yii\web\View::POS_HEAD
);

終わり!


しかし本番環境では通常、スクリプトを最後にロードする必要があり、代わりに Yii2 に JavaScript を処理させます。

$this->registerJs(
    '$("document").ready(function(){ alert("hi"); });'
);

これで、Yii はこの js を処理し、重要なもの (jQuery など) の後に配置します。

ただし、IDE は通常、この種の言語の入れ子 (PHP 内の JavaScript) の処理が苦手で、構文の強調表示が機能しなくなる可能性があることにすぐに気付くでしょう。これを解決する 1 つの方法は、スクリプトを別のファイルに登録することです。

$this->registerJsFile( 'myScript.js' );

スクリプトをロードする順序をさらに制御したい場合は、2 番目の引数として依存関係を追加し、3 番目の引数として追加のオプションを追加できます。

$this->registerJsFile( 
    'myScript.js', 
    ['\backend\assets\AppAsset'],  
    ['position' => '\yii\web\View::POS_END']
);

何らかの理由でスクリプトをインラインでレンダリングしたい場合は、次のようにします。

$this->registerJs( $this->renderPartial('myScript.js') );

スクリプトを追加するための推奨される方法は、AssetBundlesを使用することです。jsassets/AppAssets.phpファイルを調べて $js-array に追加します。

于 2014-02-08T10:32:02.127 に答える
0

ライブラリ固有の用途でアセットが必要な場合はいつでも、次のようにビュー ファイルに登録します。

use yii\web\JqueryAsset;
JqueryAsset::register(this);

あるいは、内の属性にを追加yii\web\JqueryAssetすると、メイン レイアウト (デフォルトでは Yii2 ボイラープレート) にアセットを登録していれば、すべてのビューに対してアセットが自動的に読み込まれます。$dependsAppAsset

プロジェクトで kartik-v の yii2-date-range を使用したかったので、次のようにしました。

use kartik\daterange\DateRangePicker;
use kartik\daterange\MomentAsset;
use yii\web\JqueryAsset;

JqueryAsset::register(this);
MomentAsset::register(this);
...
echo DateRangePicker::widget([ 
    'model' => $model, 
    ...
]);

小枝のテンプレート化に切り替えたので、私の見解では次のコードになりました。

{{ use('kartik/daterange/DateRangePicker') }}
{{ use('kartik/daterange/MomentAsset') }}
{{ use('yii/web/JqueryAsset') }}
{{ register_jquery_asset() }}
{{ register_moment_asset() }}
...
{{ date_range_picker_widget({ 
    'model': model, 
    ...
   }) }}
于 2016-07-07T11:10:15.043 に答える