2014-02-06 6 views
31

내보기 내부에 자바 스크립트를 추가하면 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> 

내가로드 페이지 후 경고를 표시하려면이 간단한 스크립트를 얻을 필요가있다. 내 사용자 정의 스크립트 후,이 스크립트 파일에 결과

AppAsset::register($this); 

페이지의 끝에서 등록 할를 호출하여 여기 YII 부하가 자동으로 (내가 생각하는) 이후 레이아웃에서 스크립트 파일 중 하나를 호출 hav'nt .

해결 방법?

+0

이 오류는 기본적으로 jQuery가로드되지 않은 뷰에서 자바 스크립트를 해석 할 때 발생한다는 것을 의미합니다. 문제를 해결하는 방법은 여러 가지가 있지만 먼저보기 및 컨트롤러 코드 중 일부를 보여줄 수 있으므로 귀하를 도와 드릴 수 있습니다. –

+0

@ArmanP. 질문 업데이트 됨 :-) –

답변

77

Yii2는 마지막으로 페이지에 스크립트 (jquery 등)를 삽입합니다. 이것은 의도되고 바람직합니다. 그러나 jQuery가 스크립트 이후에로드되므로 스크립트가 실행될 때 jQuery가 아직 존재하지 않는다는 것을 의미합니다.

빠른 테스트를위한 가장 쉬운 방법은 yii 스크립트 (jquery 등)를 페이지 헤드로 이동하는 것입니다. assets\AppAsset.php을 수정하고이를 추가

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

가 완료!


는 그러나 생산에 당신은 일반적으로 스크립트가 마지막으로로드 할, 대신 당신은 Yii2이 자바 스크립트 처리하도록 :

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

지금 YII이 처리됩니다

을 JS와 jQuery를 (같은 중요한 아무것도 후 배치).

그러나 IDE의 경우 일반적으로 이런 종류의 언어 중첩 (PHP 내부 JavaScript)을 처리하는 것이 좋지 않으므로 구문 강조가 중단 될 수 있습니다. 그것을 해결하는 한 가지 방법은 별도의 파일에 스크립트를 등록하는 것입니다

당신이, 당신은 당신의 두 번째 인수로 종속성을 추가하고, 같은 추가 옵션 수있는 스크립트를로드하는 순서에 대해 더 많은 제어를 원하는 경우
$this->registerJsFile('myScript.js'); 

셋째 : 당신이 어떤 이유로 절대적 스크립트가 인라인 렌더링하려면

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

당신이 할 수 있습니다

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

스크립트를 추가하는 가장 좋은 방법은 AssetBundles입니다. assets/AppAssets.php을보고 js- 파일을 $ js- 배열에 추가하십시오.

+0

'public $ jsOptions = array ( 'position '=> View :: POS_HEAD );'을 추가 할 때 ippi.Class 'backend \ assets \ View' AppAsset.php –

+1

'use yii \ web \ View; '또는'position '=> \ yii \ web \ View :: POS_HEAD'로 변경하십시오. 놓친 것이 유감이지만 유능한 IDE가이 작업을 수행 할 것입니다. – ippi

+0

위치가있는 코드 스 니펫이 잘못되었습니다. YII는 2.0.6 현재는 '$ this-는> registerJsFile는 ('/ JS/map.js ' [ 는 => ['\ YII의 \ 웹 \ JqueryAsset '] '위치 '의존' 같아야 '=> \ yii \ web \ View :: POS_END, ], 'frontendMapJs ');' –

0

당신이 라이브러리의 특정 사용을 위해 일부 자산을 필요로 할 때마다,이 같은 뷰 파일에 등록 : 당신이 AppAsset 내부에 $depends 속성에 yii\web\JqueryAsset를 추가하는 경우,

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

또는 자산이 자동으로로드됩니다 기본 레이아웃 (기본적으로 Yii2 상용구에 있음)에 등록했다면 모든보기에 대해.

내가 내 프로젝트에 kartik-V에서 yii2 최신 범위를 사용하고 싶어하고 이런 짓을 :

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, 
    ... 
    }) }} 
+0

'정의되지 않은 상수의 사용 this - 'jquery는 제안 된 방법을 사용하여 내보기에 포함되지 않습니다. –

관련 문제