2014-12-26 3 views
15

Ich habe A.php View-Datei in /views/A/ Ordner. Und ich habe A.js js-Datei in /views/A/ Ordner Bitte helfen Sie mir, js-Datei in der Ansicht Datei zu registrieren.yii2 Registrierung von JS-Dateien zu einer Ansicht

Wie ich verstehe, muss ich $this->registerJsFile('path/to/file.js'); in Ansichtsdatei schreiben.

Aber (Frage A) bekomme ich method registerJsFile is not found in a class Nachricht von PHPSstorm.

Auch (Frage B) Was soll ich im Pfad schreiben, wenn man bedenkt, dass sich beide Dateien im selben Ordner befinden /views/A/?

Antwort

5

gibt es einen bestimmten Grund, die Datei manuell, anstatt die Schaffung eines Asset-Bundle enthalten?

Auf jeden Fall, wenn Sie die documentation regarding assets gelesen haben, würden Sie bemerkt haben, dass es eine klare Unterscheidung geht um Quelle, veröffentlicht und externen Vermögen.

Der wichtigste Teil davon zu sein, dass Quelle und veröffentlicht Vermögenswerte verschiedene Optionen verwenden, um zu bestimmen, ob und wie eine Datei veröffentlicht werden soll.

In Ihrem Fall haben Sie eine Quelle Asset, die in das Asset-Verzeichnis kopiert werden muss.

Der Aufruf von registerJsFile als hinted in the documentation, erwartet ein veröffentlicht Asset.

Hier haben Sie speziell zwei Optionen, die wahrscheinlich die ersten mehr schnell und stimmig:

  1. Bewegung der Vermögenswert im web/ Ordner, wie in web/js/ oder was auch immer Sie bevorzugen, und halten registerJsFile()
  2. Add verwenden ein neues Asset-Bundle für Quelle Vermögenswerte, unter Angabe der verschiedenen Optionen wie in der oben verlinkten Seite beschrieben.

Hoffen, dass dies die Dinge klären.

+0

Ich registriere diese Dateien, weil ich möchte, dass die Datei nur in einer bestimmten Ansicht verwendet wird und in anderen Ansichten, die ich möchte Verwenden Sie andere JS-Dateien.Ist das mit Vermögenswerten möglich? Ich habe nicht verstanden, ob es eine Möglichkeit gibt, Asset Manager anzuweisen, diese Datei nur in der A-Ansicht zu verwenden, und diese Datei nur in der B-Ansicht zum Beispiel – David

+0

. Sie müssten ein bestimmtes Asset erstellen, um in dieser bestimmten Ansicht registriert zu werden. Es ist zwar möglich, eine neue Datei basierend auf bestimmten Bedingungen (wie in der Dokumentation angegeben) einzufügen, indem Sie die Methode 'init()' der Asset-Bundle-Klasse implementieren, dies hängt jedoch von Fall zu Fall ab. –

1

A: Aus der Dokumentation: http://www.yiiframework.com/doc-2.0/yii-web-view.html Ihr Code scheint korrekt zu sein.

Registrierst du die js aus der View-Datei selbst? nicht der Controller? Die Methode registerJsFile() stammt aus der View-Klasse.

Es ist sehr wahrscheinlich, dass Ihre IDE die Methode nicht findet, haben Sie es in einer Apache-Umgebung ausprobiert?

B: Verwenden Sie einen Alias ​​

+0

A: Problem war, dass ich $ this-> registerJsFile vor $ this-> Titel und $ this-> mit params it Now Arbeiten und Datei ist enthalten, aber ich denke, ich habe ein Problem mit dem Pfad. Ich habe '@ app/views/A/A.js' verwendet, aber es funktioniert nicht :( – David

11

Dies ist nicht elegant, aber die Arbeit, wenn Sie Ihre js Datei nach jquery registriert haben müssen (wie im Yii2 doc gesehen)

<?php $this->registerJsFile(Yii::$app->request->baseUrl.'/js/youFile.js',['depends' => [\yii\web\JqueryAsset::className()]]); ?> 
1

auf gegeben Poisson Ihre js Datei registrieren

$this->registerJsFile('path/to/file.js', ['position' => \yii\web\View::POS_END]); 

Das erste Argument ist der tatsächliche JS-Code, den wir in die Seite einfügen möchten. Das zweite Argument legt fest, wo das Skript in die Seite eingefügt werden soll. Mögliche Werte sind:

Ansicht :: POS_HEAD für Kopfteil.

Ansicht :: POS_BEGIN für rechts nach dem Öffnen.

Ansicht :: POS_END für rechts vor dem Schließen.

Ansicht :: POS_READY zum Ausführen von Code auf Dokument bereit Ereignis.

Dadurch wird jQuery automatisch registriert. View :: POS_LOAD zum Ausführen von Code beim Laden eines Dokuments. Dadurch wird jQuery automatisch registriert. Das letzte Argument ist eine eindeutige Skript-ID, die verwendet wird, um einen Codeblock zu identifizieren und einen vorhandenen mit der gleichen ID zu ersetzen, anstatt einen neuen Code hinzuzufügen. Wenn Sie es nicht angeben, wird der JS-Code selbst als ID verwendet.

Ein externes Skript kann wie folgt ergänzt:

$this->registerJsFile('http://example.com/js/main.js', ['depends' => [\yii\web\JqueryAsset::className()]]); 

Die Argumente für registerJsFile() für registerCssFile denen ähnlich sind(). Im obigen Beispiel registrieren wir die Datei main.js mit der Abhängigkeit von JqueryAsset. Dies bedeutet, dass die Datei main.js NACH jquery.js hinzugefügt wird. Ohne diese Abhängigkeitsspezifikation wäre die relative Reihenfolge zwischen main.js und jquery.js nicht definiert.

3

Wenn Sie eine JS-Datei registrieren, indem:

$this->registerJsFile("@web/js/all.js"); 

Dies funktioniert, aber Sie werden nicht jQuery nutzen können. Weil diese Datei all.js vor jQuery geladen wird. Um nach jQuery zu laden, machen wir es abhängig von 'yii\web\YiiAsset' oder \yii\web\JqueryAsset. So wird es nach jQuery.js geladen. Beispiel:

$this->registerJsFile("@web/js/all.js",[ 
    'depends' => [ 
     \yii\web\JqueryAsset::className() 
    ] 
]); 

So Was ist der Unterschied zwischen \yii\web\JqueryAsset und \yii\web\YiiAsset?

In jQueryAsset wird die js-Datei nach jQuery.js geladen und in YiiAsset wird die js-Datei nach yii.js Datei geladen.

Wenn Sie Ihre eigenen erstellen möchten Asset-Bundle:

<?php 
namespace frontend\components; 
use yii; 

use yii\web\AssetBundle; 
class CustomAssets extends AssetBundle 
{ 
    public $css = [ 
     "path/to/css/file.css" 
    ]; 
    public $js = [ 
     "path/to/js/file.js" 
    ]; 
    public $depends = [ 
    ]; 
} 
Verwandte Themen