Wie kann ich dafür sorgen, dass ein Codeblock in einem benutzerdefinierten Tag nur beim ersten Aufruf des Tags ausgeführt wird?

StackOverflow https://stackoverflow.com/questions/731599

  •  06-09-2019
  •  | 
  •  

Frage

Ich erstelle eine Reihe benutzerdefinierter ColdFusion-Tags, die die Wiederverwendung bestimmter Layoutelemente vereinfachen sollen.Ich werde sie auf ähnliche Weise wie folgt verwenden:

<cfimport prefix="layout" taglib="commonfunctions/layouttags">

<layout:fadingbox>
    This text will fade in and out
</layout:fadingbox>
<layout:stockticker>
    This text will scroll across the screen
</layout>

Damit der Code, den diese benutzerdefinierten Tags generieren, funktioniert, muss eine JavaScript-Datei wie folgt mit der Seite verknüpft werden:

<script src="commonfunctions/layouttags/enablingscript.js" type="text/javascript"></script>

Ich würde es vorziehen, das Skript aus den benutzerdefinierten Tags heraus einzubinden, anstatt es vom Benutzer selbst einbinden zu lassen.Das Problem besteht darin, dass nur die JavaScript-Datei enthalten sein sollte einmal pro Seite.Nachdem eines dieser benutzerdefinierten Tags zum ersten Mal verwendet wird, möchte ich, dass nachfolgende Aufrufe desselben Tags auf derselben Seite erfolgen, um eine Wiederholung des <script>-Tags zu vermeiden.Mir ist in den Sinn gekommen, dass ich so etwas tun könnte:

<cfif NOT isDefined("Caller.LayoutTagInitialized")>
    <script src="commonfunctions/layouttags/enablingscript.js" type="text/javascript"></script>
</cfif>
<cfset Caller.LayoutTagInitialized = 1>

...aber es scheint unelegant.

Ich frage mich, gibt es einen besseren Weg?

Wie würden Sie das umsetzen?

Bearbeiten - Klarstellung:

Für den Fall, dass das, was ich oben geschrieben habe, keinen Sinn ergibt, hier ein detaillierteres Beispiel:

Wenn ich ein benutzerdefiniertes Tag wie dieses habe:

<cfif ThisTag.ExecutionMode EQ "start">
    <script src="commonfunctions/layouttags/enablingscript.js" type="text/javascript"></script>
    <div class="mytag">
<cfelse>
    </div>
</cfif>

...und ich habe CFML-Markup, das das Tag wie folgt aufruft:

<layout:mytag>
    One
</layout:mytag>
<layout:mytag>
    Two
</layout:mytag>
<layout:mytag>
    Three
</layout:mytag>

...Ich möchte, dass HTML wie das folgende generiert wird:

<!-- Script included only the first time the tag is called -->
<script src="commonfunctions/layouttags/enablingscript.js" type="text/javascript"></script>
<div class="mytag">
    One
</div>
<!-- No <script> tag on the second call -->
<div class="mytag">
    Two
</div>
<!-- No <script> tag on the third call -->
<div class="mytag">
    Three
</div>
War es hilfreich?

Lösung

Ihre Lösung ist nicht mehr weit.

Sam hat Recht, dass Sie den Ausführungsmodus verwenden möchten, wenn Sie möchten, dass etwas im Start- oder Endmodus des Tags ausgegeben wird, was Teil Ihrer Anforderungen ist.

Aber dann sagen Sie, dass Sie möchten, dass das Skript-Tag nur im Startmodus des ersten auf der Seite verwendeten Tags angezeigt wird.

Hier würden Sie Peters Vorschlag zum Anforderungsbereich verwenden.Im Gegensatz zum Standardbereich (oder „Variablen“) wird der Anforderungsbereich von allen benutzerdefinierten Tags einer bestimmten Anforderung gemeinsam genutzt.Sie haben vorgeschlagen, den Aufruferbereich zu verwenden, und das könnte auch funktionieren, es sei denn, der Aufrufer wäre ein anderes benutzerdefiniertes Tag. In diesem Fall wäre der Aufruferbereich nur der lokale Bereich im benutzerdefinierten Tag.Der Anforderungsbereich (den es seit etwa CF 4.01 gibt) ist die beste Wahl.

In diesem Fall lag Ihr Lösungsvorschlag nahe:Überprüfen Sie im benutzerdefinierten Tag im Startmodus programmgesteuert, ob Sie bereits eine Tracking-Variable im Anforderungsbereich erstellt haben, wenn Sie das Skript-Tag zum ersten Mal veröffentlichen.Wenn nicht, geben Sie das Skript-Tag aus und erstellen Sie die Tracking-Variable.

Abgesehen davon, dass Sie Ihren Code von „Caller“ zu „Request“ ändern, würde ich auch vorschlagen, dass Sie den CFSET in das IF einfügen möchten.Es ist nicht erforderlich, es erneut auszuführen, wenn der IF-Test fehlschlägt.

Andere Tipps

Mit der Anfrage Anwendungsbereich.

Benutzerdefinierte Tags über einen integrierten Rahmen genannt thistag haben.

Dieser Code funktioniert:

<cfif thisTag.ExecutionMode eq "start">
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top