2016-01-19 11 views
6

Ich habe eine Ansicht, in der ich JQuery in meiner Kopfzeile zusammen mit einer anderen JS-Bibliothek aufrufen muss. Für alle anderen Seiten können sie am Ende des Dokuments gerendert werden. Was ist der beste Weg, dies in Yii2 zu erreichen?Bedingte AppAssets

Derzeit Ich tue dies nur in meinem AppAsset.php

public $js = [ 
    'https://code.highcharts.com/highcharts.js', 
]; 
public $jsOptions = ['position' => \yii\web\View::POS_HEAD]; 

Ich habe sah ein new Asset zu machen, aber es hat nicht zu funktionieren scheint, und ich war nicht sicher, ob es der richtige Weg war darüber zu gehen. Da ich das JS nicht auf jeder Seite zuerst darstellen möchte.

<?php 

namespace app\assets; 

use yii\web\AssetBundle; 

class EarlyJavaScriptAsset extends AssetBundle 
{ 
public $js = [ 
'https://code.highcharts.com/highcharts.js', 
]; 
public $jsOptions = ['position' => \yii\web\View::POS_HEAD]; 

public $publishOptions = [ 
    'only' => [ 
     'report/report-1', // this is view folder location 
    ] 
]; 
} 

Antwort

1

Wenn Sie AssetBundle::register() aussehen würden Sie würden sehen, dass es View::registerAssetBundle() ohne zweiten Parameter verwendet. Aber dieser zweite Parameter ist das, was Sie brauchen:

@param integer | null $ position wenn gesetzt, erzwingt dies eine minimale Position für Javascript-Dateien. Dies wird abhängig von der Position der Javascript-Dateiposition anpassen oder fehlschlagen, wenn die Anforderung nicht erfüllt werden kann. Wenn dies null ist, werden die Einstellungen der Asset-Bundles nicht geändert. Weitere Informationen zu Javascript-Position finden Sie unter registerJsFile.

Ihrer Ansicht nach, wo Sie Ihre Asset-Bundle registrieren, ändern

EarlyJavaScriptAsset::register($this); 

zu

$this->registerAssetBundle(EarlyJavaScriptAsset::className(), $this::POS_HEAD); 

und

$this->registerAssetBundle(EarlyJavaScriptAsset::className(), $this::POS_END); 

in der zweiten Ansicht

PS: Natürlich $this ist der Kontext Ihrer View.

+0

Eine wunderbare Antwort - Danke – Jonnny