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 ファイルをページごとに 1回だけ含める必要があることです。これらのカスタム タグの 1 つが初めて使用された後、<script> タグの繰り返しを避けるために、同じページの同じタグへの後続の呼び出しが必要です。私はこのようなことができると思いました:

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

3 に答える 3

6

Request スコープを使用します。

于 2009-04-08T21:42:29.653 に答える
1

カスタムタグには、thistag と呼ばれる組み込みのスコープがあります。

このコードは動作します:

<cfif thisTag.ExecutionMode eq "start">
于 2009-04-08T20:19:31.523 に答える
1

あなたの解決策はそう遠くありません。

実行モードは、タグの開始モードまたは終了モードで何かが出てくるようにしたいときに使用したいものであるというサムの権利です。これは、必要なものの一部です。

しかし、そのスクリプト タグを、ページで使用されている最初のタグのみの開始モードで配置する必要があるとします。

そこで、Peter のリクエスト スコープの提案を使用します。デフォルト (または「変数」) スコープとは異なり、リクエスト スコープは、特定のリクエストのすべてのカスタム タグで共有されます。呼び出し元スコープの使用を提案しましたが、呼び出し元が別のカスタム タグでない限り、それも機能します。その場合、呼び出し元スコープはカスタム タグのローカル スコープのみになります。request スコープ (CF 4.01 から使用されています) が最適です。

その場合、提案されたソリューションは近かったです。カスタムタグの開始モードで、最初にスクリプトタグを配置したときに、リクエストスコープに追跡変数が既に作成されているかどうかをプログラムで確認します。そうでない場合は、スクリプト タグを出して、追跡変数を作成します。

コードを呼び出し元から要求に変更する以外に、CFSET を IF 内に配置することもお勧めします。IF テストが失敗した場合に再度実行する必要はありません。

于 2009-04-14T20:43:46.800 に答える