2009-04-08 7 views
4

Я создаю набор специальных тегов 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> 

... но кажется неэлегантным. Интересно, есть ли лучший способ? Как бы вы это реализовали?

Edit - Разъяснение:

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

Если у меня есть пользовательский тег, как это ...

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

ответ

1

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

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

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

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

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

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

1

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

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

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

Я знаю об этом. Это не то, о чем я говорю. Это то, что я хочу: Script tag incl here, Но не здесь А также не здесь.. Видеть? –

+0

Вопрос отредактирован для уточнения. –

+1

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

6

Используйте рамки запроса.

+0

Хорошо, я предполагаю, что я делал это так же хорошо, как и получается, хотя имеет смысл использовать Request вместо Caller. Я надеялся на или что-то вроде этого. –