2015-01-04 3 views
3

ColdFusion 구조를 Javascript로 보내고 싶습니다. 필자는 이것을 어떻게 할 것인지에 대해 cfwddx 태그를 발견했습니다. 거기서 나를 끝내주는 것 같습니다.ColdFusion에서 cfwddx 태그 사용 방법

xyz = new Object(); xyz["betty"] = "1"; xyz["nancy"] = "2"; 
: 나는 # genstr #의 출력에서 ​​볼 때하는 cfdump가 올바른 들어있는 정답

output of cfdump

을 제공 자바 스크립트 코드를 테스트 프로그램

<head> 
<script type = "text/javascript" src = "frag3.js"> </script> 
</head> 
<body> 

<cfset str = StructNew()> 
<cfset str['betty'] = 1> 
<cfset str['nancy'] = 2> 
<cfdump var = "#str#"> 

<cfwddx action="CFML2JS" 
    input="#str#" 
    toplevelvariable="xyz" 
    output = "genstr"> 

<cfoutput> 
<script type = "text/Javascript"> 
test('betty') 
function test (arg) { 
alert("got to test"); 
#genstr# 
alert ("xyz " + xyz[arg]); 
} 
nothing() 
</script> 
</cfoutput> 

을 생성

위와 같이 코드를 인라인하면 경고 메시지가 올바른 답을 제공합니다. 그리고 frag3.js에있는 "nothing()"함수를 호출하면 경보가 실행되었음을 알 수 있으므로 src 문이 작동합니다.

그러나 function test (arg) 자체를 frag3.js로 옮기면 실행되지 않습니다.

누구나 내 ColdFusion 코드에서 인라인 대신 "테스트"를 외부 함수로 사용하는 방법을 알 수 있습니까? BTW, 나는 jquery 배웠지 않은, 그래서 jquery 답변 많이 도움이되지 않습니다; 기본 자바 스크립트가 필요합니다.

+3

WDDX –

답변

-1

내가 큰 CF 개발자하지만, JSON은 CF 페이지 내에서 JS 변수로 예를 들어 SerializeJson()

사용 나는 자바 스크립트 소비를위한 출력 구조체와 배열을 알고있는 간단한 방법이 아니에요 :

<script> 
    var myVar = <cfoutput>#SerializeJson(str)#</cfoutput>; 
</script> 

JSON은 문자열입니다 ... 스크립트 태그 내에서 인쇄 할 때 javascript는 클라이언트에서 구문 분석 할 필요없이이를 배열 또는 객체로 읽습니다.

나는 문제에 대한 가장 효과적인 솔루션은 아마 문서 자체의 동적 콘텐츠 인라인 포함 될 것입니다 또한 아약스 전달

+0

보다 광범위하게 지원되므로 JSON이 더 좋은 해결책 일 수 있습니다. 그렇다면 다음과 같이하십시오.'var myVar = JSON.parse (" #SerializeJSON (str) # "); ' – Tomalak

+0

@Tomalak 아니요. 자세한 내용을 확인하십시오. 그것이 인쇄 할 때 외부 따옴표가 없다 – charlietfl

+0

내가 실수로 원래의 것 – charlietfl

0

에 대한 동일한 출력을 사용합니다.

test(arg) 함수를 Javascript 파일에 복사하면 #genstr#도 복사하는 것입니까? 그래서 js 파일에서 위와 똑같이 보입니다.

이것은 의도 한대로 작동합니다. .js 파일은 콜드 퓨전을 처리하지 않으며 개발자 콘솔을 보면 구문 오류가 발생했을 수 있습니다.

문서에 인라인으로 유지하거나 js 파일의 확장자를 .cfm으로 변경할 수 있습니다.

이 시점에서 js_main.cfm (예) 파일은 다른 브라우저에서 요청한 파일처럼 취급되며 요청 처리가 있으면 헤더 및 푸터가 삭제되므로 더 많은 오류가 발생합니다. 이 파일들을 보호해야합니다. 당신은

<!--- This checks the path to make sure it doesn't contain livemedia. ---> 
<cfif not listfind(cgi.script_name,"livemedia","/")> 
    ... do includes 
</cfif> 

같은 응용 프로그램 파일에 일부 cfifs이 작업을 수행 할 수 있습니다 또는 당신은 아마 할 것 좋아해요 그냥 자신의 응용 프로그램과 함께 CFM 확장과 함께, CSS 파일을 JS를 제공하기위한 폴더에이 파일을 잠글 수 있습니다 .cfc/cfm을 사용하여 사이트의 전역 파일을 덮어 씁니다. 동적으로 geerated js/css가 최상의 옵션이라고 생각한 상황에 처했을 때.

정말 필요한 경우 OP 및 릴레이 변수에 표시되는대로 클라이언트 측에 할 수 있습니다. 또는 두 개의 "응용 프로그램"을 동일하게 이름을 지정할 수 있으며 데이터 공유를 매우 쉽게하는 반면, 공유하는 항목을주의 깊게 살펴보고 하위 응용 프로그램을 적절히 보호해야합니다.

그렇습니다. 다른 사람들이 제안한 것처럼, #SerializeJSON()#은 서버 측 변수/객체를 클라이언트 측에 복사하는 현대적인 방법입니다. 예컨대

..

<cfset CFStruct = {big = "little", red = "blue", subArray = ["A","B","C","D"]} /> 
<script> 
    <cfoutput>JSObj = #SerializeJSON(CFStruct)#;</cfoutput> 
</script> 
<!--- While I use shorthand to form the struct and subArray, that's only for speed, 
    structs, arrays, queries, etc formed in any fashion work just fine. ---> 

은 (하위 요소를 갖는다 A, B, C, D) 요소와 big, red, subArrayJSObj를 생성한다.

여전히 어떤 방법을 선택하든 (wddx 또는 SerializeJSON()) 이러한 파일은 .js 파일에서 작동하지 않습니다.

서버에서 .js 파일을 구문 분석 할 수 있도록 허용하는 다른 옵션이 있지만 여기에는 가치가있는 것보다 훨씬 많은 고통이 있습니다. 일반 js 파일을 사용하는 경우가 많이 있습니다. 파일이 <script><link> 같은 클라이언트 측 태그를 통해 호출

참고 완전히 별도의 요청 있습니다. 그들은 url, form, request, variables 범위를 공유하지 않습니다. 그러나 두 응용 프로그램이 동일한 이름을 가진 경우 cookiesclientsession 범위를 공유 할 수 있습니다.

마지막으로 확장명에 관계없이 html 태그를 통해 호출되는 외부 콘텐츠에 대한 멋진 점은 일반적으로 기본적으로 캐시된다는 것입니다. 대역폭과 페이지를 빠르게로드하는 경우에도 비 캐시 된 사본을 일관되게로드하려는 시나리오가 있기 전까지는이 방법이 유용합니다.

외부 파일에 고정시키고 싶은 것을 동적으로 생성해야한다고 생각하면 몇 가지 방법이 있습니다.

  1. 헤더에 no-cache를 설정할 수 있습니다 (CF 또는 Htaccess가이 작업을 수행 할 수 있음).
  2. 스크립트 호출의 쿼리 문자열에 임의의 숫자를 제공 할 수 있습니다. <script src="/livemedia/js_main.cfm?randomizer=#randrange(1,1000000)#"></script>
  3. 아마도 파일은 모든 사용자에게 매번 새로 고칠 필요가 없으며, 아마도 각 사용자가 다른 사본을 볼 필요가있을 수도 있습니다. 여러 사용자가 같은 컴퓨터에서 로그인 할 수 있기 때문에 여전히 쿼리 문자열을 첨부합니다. 그러나 사용자별로 다를 수 있습니다.
  4. <script src="/livemedia/js_main.cfm?#session.username#"></script>은 페이지가 컴파일하는 방법을 재검토하고 페이지에서 라이브 인라인 할 필요가 데이터를 저장합니다.

자바 스크립트 파일의 쿼리 문자열에 뭔가를 첨부하는 경우 매번 재생성 할 필요가없는 별도의 파일로 파일의 정적 내용을 이동해야합니다. 1에는 동적 컨텐츠가 들어 있으므로 각 페이지 요청마다 15 개의 자바 스크립트 기능을 다시로드 할 필요가 없습니다.

+0

나는 .cfm 접근법을 시도함으로써 시작할 것이다 - 그것은 가장 단순한. 나는 매번 구조를 재생성해야하며, 같은 것을 유지할 수는 없다. 지금은 외부 파일에서만 하나의 자바 스크립트 함수가 있습니다. –

1

대신 가변 비트를 쓰는 (의 그들을 부르 자 "초기화" 또는 "구성") (당신의 다른 정적 JS 파일의 소스 코드 또는 악화) 웹 사이트의 소스 코드에, I 다음을 권장합니다.

모든 구성이 포함 된 구조체를 반환하는 원격 호출 가능 메소드가있는 구성 요소를 만듭니다. 이제 구조체를받을 서버의 ColdFusion 코드에서 Ajax를 통해 JSON을 수신 할 클라이언트의 JavaScript 코드에서 해당 메소드를 호출 할 수 있습니다.

/** Config.cfc (or call it something similar) 
    * 
    */ 

component { 
    remote struct function getConfig() returnformat="JSON" { 
     var str = StructNew(); 
     str['betty'] = 1; 
     str['nancy'] = 2; 
     return str; 
    } 
} 

당신의 main.cfm합니다 (예 단순화를 위해 나는 Ajax 요청을 처리하기 위해 jQuery를 포함) :

<html> 
<head> 
    <script type="text/javascript" src="frag3.js"></script> 
    <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> 
</head> 
<body> 
    <h1>Config, as seen by the server</h1> 
    <cfinvoke component="Config" method="getConfig" returnvariable="cfg"> 
    <cfdump var="#cfg#"> 

    <h1>Config, as seen by the client</h1> 
    <pre id="cfgDump"></pre> 

    <script type="text/javascript"> 
    $(function() { 
     $.get("Config.cfc?method=getConfig").done(function (cfg) { 
      // cfg already is a regular JS object at this point 
      // convert to JSON again for display purposes 
      $("#cfgDump").text(JSON.serialize(cfg, null, 2)); 
     }); 
    }); 
    </script> 
</body> 
</html> 

깨끗하고 간단합니다.

+0

테스트 페이지라고했습니다. 이러한 상황에서 하드 코딩 된 값을 사용하는 것이 적절합니다. 그것은 일을 단순화하고 어려움을 초래하는 부분에 집중할 수있게 해줍니다. –

+0

참. 나는 "적절한"접근 방법을 찾아 낼 수 없었습니다. 클라이언트 측의 – Tomalak

+0

은'$ .ajax' dataType을'$ .get' 인수 나'$ .getJSON'으로 설정하는 것을 포함합니다. – charlietfl

관련 문제