2009-04-08 7 views
4

Ich erstelle eine Reihe von benutzerdefinierten ColdFusion-Tags, die die Wiederverwendung bestimmter Layoutelemente vereinfachen. Ich werde sie in einer Art und Weise ähnlich der folgenden verwenden:Wie kann ich einen Codeblock in einem benutzerdefinierten Tag nur ausführen, wenn das Tag zum ersten Mal aufgerufen wird?

<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 diese benutzerdefinierten Tags, eine JavaScript-Datei in die Seite verlinkt werden muss arbeiten erzeugt etwa so:

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

Ich würde es vorziehen, das Skript aus den benutzerdefinierten Tags zu integrieren, anstatt den Benutzer selbst einzuschließen. Das Problem ist, dass die Javascript-Datei nur einmal pro Seite enthalten sollte. Nach dem ersten Mal, wenn eines dieser benutzerdefinierten Tags verwendet wird, möchte ich nachfolgende Aufrufe desselben Tags auf derselben Seite vermeiden, um die Wiederholung des Tags <script> zu vermeiden. Es fiel mir ein, 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ürdest du das umsetzen?

Bearbeiten - Klarstellung:

Falls, was ich oben hatte noch keinen Sinn geschrieben, hier ist ein detaillierteres Beispiel:

Wenn ich einen benutzerdefinierten Tag wie diese ...

<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 den Tag wie wie dieser Aufruf ...

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

... Ich möchte HTML wie die folgenden zu erzeugen:

<!-- 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> 

Antwort

1

Ihre Lösung ist nicht weit entfernt.

Sam hat Recht, dass der Ausführungsmodus das ist, was Sie verwenden möchten, wenn Sie möchten, dass etwas im Start- oder Endmodus des Tags herauskommt, was Teil Ihres Wunsches ist.

Aber dann sagen Sie, Sie wollen, dass das Skript-Tag im Startmodus nur das erste Tag auf der Seite verwendet.

Hier würden Sie Peters Vorschlag des Anforderungsbereichs verwenden. Im Gegensatz zum Standardbereich (oder "Variablen") wird der Anforderungsbereich unter allen benutzerdefinierten Tags für eine bestimmte Anforderung aufgeteilt. Sie haben vorgeschlagen, den Aufruferbereich zu verwenden. Dies könnte auch funktionieren, sofern der Aufrufer kein anderes benutzerdefiniertes Tag ist. In diesem Fall wäre der Aufruferbereich nur der lokale Bereich im benutzerdefinierten Tag. Der Anfrageumfang (der seit ca. 4.01 besteht) ist Ihre beste Wahl.

In diesem Fall war Ihre vorgeschlagene Lösung geschlossen: Überprüfen Sie im benutzerdefinierten Tag im Startmodus programmatisch, ob Sie bereits eine Verfolgungsvariable im Anforderungsbereich erstellt haben, wenn Sie das Skript-Tag zum ersten Mal verwenden. Ist dies nicht der Fall, legen Sie das Skript-Tag ab und erstellen Sie die Tracking-Variable.

Anders als Code Wechsel von Anrufer mit beantragen, auch ich würde vorschlagen, dass Sie würde die CFSET innerhalb des IF setzen. Es muss nicht erneut ausgeführt werden, wenn der IF-Test fehlschlägt.

1

Benutzerdefinierte Tags haben in Rahmen genannt thistag ein gebaut.

Dieser Code wird funktionieren:

<cfif thisTag.ExecutionMode eq "start"> 
+0

Ich weiß darüber. Das ist nicht was ich meine. Das ist, was ich will: Script-Tag inkl hier, Aber nicht hier Und auch hier nicht. Sehen? –

+0

Frage bearbeitet, um zu klären. –

+1

ah, ich sehe was du meinst. Ich glaube nicht, dass etwas daran falsch ist, wie Sie es implementiert haben. Ich würde wahrscheinlich den Anforderungsbereich anstelle des Aufruferbereichs verwenden, aber das ist mehr Präferenz als alles andere. –

6

den Antrag Bereich verwenden.

+0

Ok, ich denke, die Art, wie ich es gemacht habe, war so gut wie es geht, obwohl es sinnvoll ist, Request anstelle von Caller zu verwenden. Ich habe auf ein oder etwas gehofft, denke ich. –