¿Cómo puedo hacer que un bloque de código en una etiqueta personalizada solo se ejecute la primera vez que se llama a la etiqueta?

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

  •  06-09-2019
  •  | 
  •  

Pregunta

Estoy creando un conjunto de etiquetas personalizadas de ColdFusion diseñadas para facilitar la reutilización de ciertos elementos de diseño.Los usaré de una manera similar a la siguiente:

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

Para que el código que generan estas etiquetas personalizadas funcione, es necesario vincular un archivo JavaScript a la página de esta manera:

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

Preferiría incluir el script desde dentro de las etiquetas personalizadas, en lugar de hacer que el usuario lo incluya él mismo.El problema es que el archivo JavaScript solo debe incluirse una vez por página.Después de la primera vez que se usa una de estas etiquetas personalizadas, me gustaría realizar llamadas posteriores a la misma etiqueta en la misma página para evitar repetir la etiqueta <script>.Se me ha ocurrido que podría hacer algo como esto:

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

...pero parece poco elegante.

Me pregunto, ¿hay una mejor manera?

¿Cómo implementarías esto?

Editar - Aclaración:

En caso de que lo que escribí arriba no tuviera sentido, aquí hay un ejemplo más detallado:

Si tengo una etiqueta personalizada como esta:

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

...y tengo marcado CFML llamando a la etiqueta así:

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

...Quiero que se genere HTML como el siguiente:

<!-- 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>
¿Fue útil?

Solución

Tu solución no está lejos.

Sam tiene razón en que el modo de ejecución es lo que desea usar cuando desea que salga algo en el modo de inicio o finalización de la etiqueta, que es parte de lo que desea.

Pero luego dice que desea que la etiqueta de secuencia de comandos se publique en el modo de inicio solo de la primera etiqueta utilizada en la página.

Ahí es donde utilizaría la sugerencia de Peter sobre el alcance de la solicitud.A diferencia del alcance predeterminado (o "variables"), el alcance de la solicitud se comparte entre todas las etiquetas personalizadas en una solicitud determinada.Usted propuso usar el alcance de la persona que llama, y ​​eso también podría funcionar, a menos que la persona que llama fuera otra etiqueta personalizada, en cuyo caso el alcance de la persona que llama solo sería el alcance local en la etiqueta personalizada.El alcance de la solicitud (que existe desde CF 4.01 aproximadamente) es su mejor opción.

En ese caso, la solución propuesta estaba cerca:en la etiqueta personalizada, en el modo de inicio, verifique mediante programación si ya creó una variable de seguimiento en el alcance de la solicitud cuando colocó la etiqueta de secuencia de comandos por primera vez.De lo contrario, publique la etiqueta del script y cree la variable de seguimiento.

Además de cambiar su código para que no use la persona que llama para solicitar, también le sugiero que coloque el CFSET dentro del IF.No es necesario ejecutarlo nuevamente para cuando falle la prueba IF.

Otros consejos

Utilice el ámbito de la petición.

Las etiquetas personalizadas han construido en un ámbito denominado thistag.

Este código funcionará:

<cfif thisTag.ExecutionMode eq "start">
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top