2009-04-08 3 views
4

특정 레이아웃 요소를 쉽게 재사용하도록 설계된 ColdFusion 사용자 정의 태그 세트를 작성하고 있습니다.사용자 정의 태그에서 코드 블록을 처음 만들 때 태그를 처음 실행할 때만 실행할 수 있습니까?

<script src="commonfunctions/layouttags/enablingscript.js" type="text/javascript"></script> 
: 이러한 사용자 정의 태그 작업을 생성하는 코드에 대한 위해
<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> 

는, 자바 스크립트 파일이 필요

은과 같이 페이지에 링크 될 : 나는 다음과 같은 방식을 사용할 것

사용자가 직접 태그를 포함시키는 대신 사용자 정의 태그 내부에서 스크립트를 포함하는 것을 선호합니다. 문제는 자바 스크립트 파일은 페이지 당 번만 에 한 번만 포함되어야한다는 것입니다. 처음으로이 사용자 정의 태그 중 하나를 사용한 후에는 < 스크립트 > 태그를 반복하지 않도록 동일한 페이지에서 동일한 태그에 대한 후속 호출을하고 싶습니다. ... 나는 이런 식으로 뭔가를 할 수 있다는 것을 나에게

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

답변

1

당신의 해결책은 그리 멀지 않습니다.

Sam의 말이 맞습니다. 실행 모드는 원하는 태그의 시작 또는 끝 모드에서 무엇인가 나오길 원할 때 사용하려는 것입니다.

하지만 스크립트 태그를 페이지에서 사용 된 첫 번째 태그의 시작 모드로 지정한다고 가정합니다.

여기서 요청 범위에 대한 Peter의 제안을 사용합니다. 기본 (또는 "변수") 범위와 달리 요청 범위는 주어진 요청의 모든 사용자 정의 태그에서 공유됩니다. 발신자가 다른 맞춤 태그가 아닌 경우 발신자 범위를 사용하여 제안했으며 발신자 범위가 맞춤 태그의 로컬 범위 일 경우에만 작동 할 수 있습니다. 요청 범위 (CF 4.01 이후였습니다)가 최선의 선택입니다.

그런 경우 제안 된 솔루션이 닫혔습니다. 사용자 정의 태그에서 시작 모드에서 스크립트 태그를 처음 작성할 때 요청 범위에 추적 변수를 이미 작성했는지 프로그래밍 방식으로 확인하십시오. 그렇지 않은 경우 스크립트 태그를 입력하고 추적 변수를 만듭니다.

발신자를 사용하여 코드를 변경하여 요청하는 것 외에 다른 경우에는 CFSET을 IF에 넣을 것을 제안합니다. IF 테스트가 실패 할 때 다시 실행할 필요가 없습니다.

1

사용자 정의 태그는 범위라고 마이그레이션 thisTag에 구축했다.

이 코드는 작동합니다

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

나는 그것에 대해 알고있다. 그게 내가 말하는게 아니야. 이것은 내가 원하는 것입니다 : 여기 포함 된 스크립트 태그, 페이딩 박스>. 만나다? –

+0

질문이 명확하게 편집되었습니다. –

+1

아, 무슨 뜻인지 알 겠어. 어떻게 구현했는지에 대해서는 문제가 있다고 생각하지 않습니다. 아마도 호출자 범위 대신 요청 범위를 사용 하겠지만 무엇보다 우선적 인 설정입니다. –

6

는 요청 범위를 사용합니다.

+0

호출자 대신 요청을 사용하는 것이 합리적이지만 그래도 잘하고있는 것처럼 보였습니다. 또는 다른 것을 기대하고있었습니다. –

관련 문제