カスタム タグ内のコード ブロックを、タグが最初に呼び出されたときにのみ実行するようにするにはどうすればよいですか?
-
06-09-2019 - |
質問
特定のレイアウト要素を簡単に再利用できるように設計された一連の 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ページあたり。これらのカスタム タグのいずれかを初めて使用した後は、<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>
解決
あなたのソリューションは、遠くではありません。
実行モードは、あなたが何をしたいの一部であり、タグの開始または終了モードで出てくるために何かを望むいるときに使用したいものです。このサムの権利
しかし、その後、あなたがページ上で使用される唯一の最初のタグの開始モードで出して、そのスクリプトタグをしたいと言います。
それはあなたがリクエストスコープのピーターの提案を使用する場所です。デフォルト(または「変数」)スコープとは異なり、リクエスト・スコープは、与えられたリクエストに応じて、すべてのカスタムタグの間で共有されます。呼び出し側は、呼び出し元のスコープは、ローカルスコープは、カスタムタグになり、その場合には、別のカスタムタグであった場合を除き、あまりにも、あなたは、呼び出し元のスコープを使用して提案し、それが仕事ができます。 (CF 4.01程度以来の周りされている)リクエストスコープは、あなたの最良の選択である。
その場合は、あなたの提案された解決策は、近くにあった:カスタムタグでは、スタート・モードでは、あなたが最初の時間外にスクリプトタグを入れたときに、すでにリクエストスコープに追跡変数を作成した場合、プログラムで確認してください。そうでない場合、スクリプトタグを出すとトラッキング変数を作成します。
要求するために、発信者を使用してから、あなたのコードを変更する以外に、私はまた、あなたがIF内でCFSETを入れたいと思いますお勧めしたいです。 IFテストが失敗したときのためにそれを再度実行する必要はありませんん。
他のヒント
Requestスコープを使用します。
カスタムタグはthistagと呼ばれる範囲に組み込まれています。
このコードは動作します:
<cfif thisTag.ExecutionMode eq "start">