Приложение: Функция JavaScript прослушивает изменения в элементах формы (ввод &) и отправляет данные в метод CFC, который назначает их структуре сеанса. Структура возвращается, делая данные формы полезными для жизни сеанса. Приложение адаптировано с кодом на Raymond Camden's Using a server, or session storage, to persist form values.Перевести сеанс с синтаксиса тегов CFScript на ColdFusion
Вопрос: Исходный код CFC написан на CFScript. Поскольку мы находимся в ColdFusion 8, я получаю сообщение об ошибке при вызове метода. Итак, я перевел этот метод в синтаксис тегов ColdFusion и прекратил эту ошибку. В Dev Dev Tools от Chrome я могу видеть данные, передаваемые CFC через объект JSON каждый раз, когда я ввожу что-то в элемент формы. Поэтому я знаю, что функция 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>
+1 для упоминания обертывания в отличие от перезаписи – Leigh
Одна вещь, которую нужно сделать в CF8, если я помню, - это переместить ваш var в верхнюю часть блока сценария. Но в противном случае cfscript должен поддерживать все современные обозначения объектов как есть. CF9 позволяет вам var где-нибудь, поскольку подъем теперь, очевидно, происходит в CF9 +. Я отредактирую это, чтобы отразить это. – williambq
@ williambq - Лучше добавить эту последнюю часть как [edit] (http://stackoverflow.com/posts/16948078/edit), поэтому она более заметна. Затем удалите комментарий. – Leigh