Ich baue eine Winkelrichtlinie, die an verschiedenen Orten verwendet wird. Ich kann die Dateistruktur der App, in der die Direktive verwendet wird, nicht immer garantieren, aber ich kann den Benutzer zwingen, das directive.js
und directive.html
(nicht die tatsächlichen Dateinamen) in denselben Ordner zu legen .
Wenn die Seite das auswertet directive.js
, betrachtet sie das templateUrl
als relativ zu sich selbst. Ist es möglich, das templateUrl
relativ zur directive.js
Datei festzulegen?
Oder wird empfohlen, die Vorlage einfach in die Direktive selbst aufzunehmen.
Ich denke, ich möchte möglicherweise unterschiedliche Vorlagen basierend auf unterschiedlichen Umständen laden. Daher würde ich es vorziehen, einen relativen Pfad zu verwenden, anstatt den zu aktualisieren directive.js
quelle
Antworten:
Die aktuell ausgeführte Skriptdatei ist immer die letzte im Skriptarray, sodass Sie den Pfad leicht finden können:
Wenn Sie sich nicht sicher sind, wie der Skriptname lautet (z. B. wenn Sie mehrere Skripte in eines packen), verwenden Sie Folgendes:
Hinweis : In Fällen, in denen ein Abschluss verwendet wird, sollte sich Ihr Code außerhalb befinden, um sicherzustellen, dass das aktuelle Skript zum richtigen Zeitpunkt ausgewertet wird, z.
quelle
<script>
Tag stößt , führt er es sofort aus, bevor die Seite weiter gerendert wird. In einem globalen Skriptbereich ist das letzte<script>
Tag immer das letzte.path = currentScriptPath.split("/"); path.pop(); path.push("directive.html");
dies tun. Dies hat keine Abhängigkeiten von Dateinamen und unterstützt "directive.js", "/directive.js" und "path / to / directive.js". Der Code-Golf-Wettbewerb besteht darin, diese in einer einzigen Aussage zu kombinieren (unter Verwendung von Splice et al.).Wie Sie sagten, wollten Sie den Direktiven zu unterschiedlichen Zeiten unterschiedliche Vorlagen zur Verfügung stellen. Warum nicht zulassen, dass die Vorlage selbst als Attribut an die Direktive übergeben wird?
<div my-directive my-template="template"></div>
Verwenden Sie dann so etwas wie
$compile(template)(scope)
innerhalb der Richtlinie.quelle
$compile
Methode auf die Vorlage zeigen, die übergeben wird? Ich muss es vielleicht$compile
trotzdem verwenden, das kann also ein guter Vorschlag sein.Zusätzlich zu der Antwort von Alon Gubkin würde ich vorschlagen, eine Konstante mithilfe eines sofort aufgerufenen Funktionsausdrucks zu definieren, um den Pfad des Skripts zu speichern und in die Direktive einzufügen:
quelle
Dieser Code befindet sich in einer Datei namens route.js
Folgendes hat bei mir nicht funktioniert:
Folgendes tat:
Mein Test basiert auf dem folgenden Blog über die Verwendung von Angle Load Load Angular: http://ify.io/lazy-loading-in-angularjs/
require.js erzeugt einen requireConfig-Bootstrap
requireConfig erzeugt eine eckige app.js.
eckige app.js erzeugt meine route.js
Ich hatte den gleichen Code, der von einem Revel-Webframework und asp.net mvc bereitgestellt wurde. In schwelgen document.getElementsByTagName ("script") wurde ein Pfad zu meiner erforderlichen Bootstrap-JS-Datei und NICHT zu meiner Routen.js erstellt. In ASP.NET MVC wurde ein Pfad zum injizierten Browser Link-Skriptelement von Visual Studio erstellt, das während der Debugging-Sitzungen dort abgelegt wird.
Dies ist mein Arbeitsrouten.js Code:
Dies ist meine Konsolenausgabe, wenn ich von Revel aus laufe.
Eine andere nette Sache, die ich getan habe, ist, die erforderliche Konfiguration zu nutzen und einige benutzerdefinierte Konfigurationen darin zu platzieren. dh hinzufügen
Sie können es dann erhalten, indem Sie den folgenden Code innerhalb von route.js verwenden
Manchmal müssen Sie eine Baseurl im Voraus definieren, manchmal müssen Sie sie dynamisch generieren. Ihre Wahl für Ihre Situation.
quelle
Einige mögen es als etwas "hackig" bezeichnen, aber ich denke, bis es nur noch einen Weg gibt, wird alles hackig sein.
Ich hatte viel Glück damit:
Wenn Sie dann den Code in einer Anwendung verwenden, nachdem Sie das Modul in die App aufgenommen haben.
In einer App-Konfigurationsfunktion:
Und in einem App-Controller (falls erforderlich):
Es verursacht einen neuen Javascript-Fehler und zieht den Stack-Trace heraus. Anschließend werden alle URLs analysiert (mit Ausnahme der anrufenden Leitung / Char-Nummer).
Sie können dann einfach die erste Datei im Array herausziehen, die die aktuelle Datei ist, in der der Code ausgeführt wird.
Dies ist auch hilfreich, wenn Sie den Code zentralisieren und dann die zweite (
[1]
) im Array herausziehen möchten , um den Speicherort der aufrufenden Datei abzurufenquelle
Wie mehrere Benutzer bereits betont haben, sind relevante Pfade beim Erstellen der statischen Dateien nicht hilfreich, und ich würde dies wärmstens empfehlen.
In Angular gibt es eine raffinierte Funktion namens $ templateCache , mit der Vorlagendateien mehr oder weniger zwischengespeichert werden. Wenn Angular das nächste Mal eine benötigt, wird anstelle einer tatsächlichen Anforderung die zwischengespeicherte Version bereitgestellt. Dies ist eine typische Verwendung:
Auf diese Weise lösen Sie beide das Problem der relativen URLs und gewinnen an Leistung.
Natürlich lieben wir die Idee, separate HTML-Vorlagen-Dateien zu haben (im Gegensatz zum Reagieren), daher ist das oben Genannte allein nicht gut. Hier kommt das Build-System, das alle HTML-Vorlagen-Dateien lesen und ein js wie das oben genannte erstellen kann.
Es gibt mehrere html2js-Module für Grunzen, Schlucken, Webpack, und dies ist die Hauptidee dahinter. Ich persönlich benutze gulp sehr oft, deshalb mag ich gulp-ng-html2js besonders, weil es genau das sehr einfach macht.
quelle