2009-04-08 11 views
4

Je crée un ensemble de balises personnalisées ColdFusion conçues pour faciliter la réutilisation de certains éléments de mise en page. Je vais les utiliser d'une manière similaire à ce qui suit:Comment faire pour qu'un bloc de code dans une balise personnalisée s'exécute uniquement la première fois que la balise est appelée?

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

Pour le code de ces balises personnalisées génère au travail, un fichier javascript doit être lié dans la page comme ceci:

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

Je préférerais inclure le script à l'intérieur des balises personnalisées, au lieu de demander à l'utilisateur de l'inclure lui-même. Le problème est que le fichier javascript ne doit être inclus une fois par page. Après la première utilisation de l'une de ces balises personnalisées, je souhaite que les appels suivants soient effectués sur la même balise sur la même page pour éviter de répéter le tag <script>. Il m'est apparu que je pouvais faire quelque chose comme ça ...

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

... Mais il semble inélégant. Je me demande, y a-t-il un meilleur moyen? Comment appliqueriez-vous cela?

Edition - Précision:

Dans le cas que j'ai écrit ci-dessus n'a pas de sens, voici un exemple plus détaillé:

Si j'ai une balise personnalisée comme ça ...

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

... et je balisage CFML appeler la balise comme comme ça ...

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

... Je veux HTML comme suit pour générer:

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

Répondre

1

Votre solution n'est pas loin. Sam a raison de dire que le mode d'exécution est ce que vous voulez utiliser quand vous voulez que quelque chose sorte dans le mode début ou fin du tag, ce qui fait partie de ce que vous voulez. Mais alors vous dites que vous voulez que cette étiquette de script soit désactivée dans le mode de démarrage de la première étiquette utilisée sur la page.

C'est là que vous utiliseriez la suggestion de Peter concernant la portée de la requête. Contrairement à la portée par défaut (ou "variables"), la portée de la demande est partagée entre toutes les balises personnalisées sur une requête donnée. Vous avez proposé d'utiliser la portée de l'appelant, et cela pourrait également fonctionner, à moins que l'appelant ne soit une autre balise personnalisée, auquel cas la portée de l'appelant ne serait que la portée locale de la balise personnalisée. La portée de la demande (qui existe depuis environ CF 4.01) est votre meilleur choix.Dans ce cas, la solution proposée était proche: dans la balise personnalisée, en mode de démarrage, vérifiez par programme si vous avez déjà créé une variable de suivi dans la portée de la requête lorsque vous avez mis la balise de script la première fois. Sinon, éteignez la balise de script et créez la variable de suivi.

En plus de modifier votre code d'utilisation de l'appelant à la demande, je suggère également que vous souhaitez mettre le CFSET à l'intérieur de l'IF. Pas besoin de l'exécuter à nouveau lorsque le test IF échoue.

1

balises personnalisées ont construit dans le champ appelé thistag.

Ce code fonctionnera:

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

Je sais à ce sujet. Ce n'est pas de ça que je parle. Voici ce que je veux: Balise de script incl ici, Mais pas ici Et aussi pas ici.. Voir? –

+0

Question éditée pour clarifier. –

+1

ah, je vois ce que tu veux dire. Je ne pense pas qu'il y ait quelque chose de mal dans la façon dont vous l'avez mis en œuvre. J'utiliserais probablement la portée de la demande au lieu de la portée de l'appelant, mais c'est plus la préférence que tout. –

6

Utilisez le champ de demande.

+0

Ok, je suppose que la façon dont je le faisais était aussi bonne que possible, bien qu'il soit logique d'utiliser Request au lieu de Caller. J'espérais un ou quelque chose, je suppose. –

Questions connexes