app: JavaScript関数はフォーム要素(入力& select)の変更をリッスンし、それらをセッション構造体に割り当てるCFCメソッドにデータをポストします。構造体が返され、フォームデータをセッションの有効期間中使用可能にします。アプリはRaymond Camden's Using a server, or session storage, to persist form valuesのコードから適合しています。CFScriptからColdFusionタグ構文へのセッションの変換
問題:オリジナルのCFCコードはCFScriptで書かれています。 ColdFusion 8を使用しているため、メソッドが呼び出されるとエラーが発生します。そこで、メソッドをColdFusionのタグ構文に変換して、そのエラーを取り止めました。 Chromeのデベロッパーツールでは、フォーム要素に何かを入力するたびに、JSONオブジェクトを介してCFCに渡すデータを確認できます。だから私はJavaScript関数が動作していることを知っています。また、私は返品エラーがないのに、私の翻訳が間違っていると私に信じさせるいくつかの行動があります。たとえば、セッション構造体のダンプには、入力された最後の入力要素のみが表示されます(Rayのデモの場合のように)。
元のCFScriptのバージョンがあり、次にタグの翻訳があります。私の翻訳が間違っている箇所についてのコメントに加えて、私はこの行の説明を<cfset s.name = [s[name]] />
、とりわけ[s[name]]
の構成にしたいと思っています。何が起こっているのかを明確にすることができないからです。ありがとう。
スクリプトの構文:
component {
remote void function preserveSession(string awardData) {
if(!isJSON(arguments.awardData)) return;
arguments.awardData = deserializeJSON(arguments.awardData);
//convert the array into a name based struct
var s = {};
for(var i=1; i<=arrayLen(arguments.awardData); i++) {
var name = arguments.awardData[i].name;
if(!structKeyExists(s, name)) {
s[name] = arguments.awardData[i].value;
} else {
//convert into an array
if(!isArray(s[name])) {
s[name] = [s[name]];
}
arrayAppend(s[name], arguments.awardData[i].value);
}
}
session.awardFormData = s;
}
}
タグ構文:
<cfcomponent>
<cffunction name="preserveSession" access="remote" returntype="void" output="no">
<cfargument name="awardData" type="string" />
<cfset var s = {} />
<cfif NOT isJSON(arguments.awardData)>
<cfreturn />
</cfif>
<cfset arguments.awardData = #deserializeJSON(arguments.awardData)# />
<cfloop index="i" from="1" to="#arrayLen(arguments.awardData)#">
<cfset name = #arguments.awardData[i].name# />
<cfif NOT structKeyExists(s, name)>
<cfset s.name = #arguments.awardData[i].value# />
<cfelse>
<cfif NOT isArray(s.name) >
<cfset s.name = [s[name]] />
</cfif>
<cfset arrayAppend(s.name, arguments.awardData[i].value) />
</cfif>
</cfloop>
<cfset session.awardFormData = s />
<cfreturn />
</cffunction>
</cfcomponent>
書き換えとは対照的にラッピングに言及してください。 – Leigh
私が思い出したようにCF8で行う必要があることは、あなたのvarをスクリプトブロックの先頭に移動することです。しかし、それ以外の場合は、cfscriptはすべての現代のオブジェクト記法をそのままサポートする必要があります。 CF9では、ホイストが明らかに現時点でCF9 +で発生するため、どこでもvarを使用できます。私はこれを反映するように編集します。 – williambq
@ williambq - 最後の部分を[編集](http://stackoverflow.com/posts/16948078/edit)として追加する方が良いかもしれないので、もっと目に見えます。次に、コメントを削除します。 – Leigh