Как сделать так, чтобы блок кода в пользовательском теге запускался только при первом вызове тега? - PullRequest
4 голосов
/ 09 апреля 2009

Я создаю набор пользовательских тегов ColdFusion, предназначенных для упрощения повторного использования определенных элементов макета. Я буду использовать их следующим образом:

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

Чтобы код, сгенерированный этими пользовательскими тегами, работал, файл JavaScript должен быть связан со страницей следующим образом:

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

Я бы предпочел включить скрипт внутри пользовательских тегов, а не заставлять пользователя включать его самому. Проблема в том, что файл JavaScript должен быть включен только один раз на страницу. После первого использования одного из этих пользовательских тегов я бы хотел, чтобы последующие вызовы одного и того же тега на той же странице не повторяли тег . Мне пришло в голову, что я могу сделать что-то вроде этого:

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

... но это выглядит не элегантно.

Интересно, есть ли лучший способ?

Как бы вы это реализовали?

Редактировать - Уточнение:

Если то, что я написал выше, не имело смысла, вот более подробный пример:

Если у меня есть такой тег:

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

... и у меня есть разметка CFML, вызывающая тэг как этот:

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

... Я хочу, чтобы генерировался HTML, подобный следующему:

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

Ответы [ 3 ]

6 голосов
/ 09 апреля 2009

Используйте область запроса.

1 голос
/ 15 апреля 2009

Ваше решение не за горами.

Сэм прав, что режим выполнения - это то, что вы хотите использовать, когда вы хотите, чтобы что-то появилось в режиме начала или конца тега, который является частью того, что вы хотите.

Но затем вы говорите, что хотите, чтобы тег сценария выводился в режиме запуска только для первого тега, использованного на странице.

Вот где вы бы использовали предложение Питера относительно объема запроса. В отличие от области по умолчанию (или «переменных»), область запроса является общей для всех пользовательских тегов данного запроса. Вы предложили использовать область вызова, и это также может сработать, если только вызывающая сторона не является другим настраиваемым тегом, и в этом случае область вызывающей стороны будет только локальной областью в настраиваемом теге. Область запросов (которая существует примерно с CF 4.01) - ваш лучший выбор.

В этом случае предлагаемое вами решение было близко: в пользовательском теге в режиме запуска программно проверьте, не создали ли вы уже переменную отслеживания в области запроса при первом выводе тега script. Если нет, поместите тег script и создайте переменную отслеживания.

Помимо изменения кода с использования вызывающей стороны для запроса, я бы также предложил вам поместить CFSET в IF. Нет необходимости выполнять его снова, если тест IF не пройден.

1 голос
/ 09 апреля 2009

Пользовательские теги имеют встроенную область видимости thistag.

Этот код будет работать:

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