L'app: Una funzione JavaScript è in ascolto per le modifiche sugli elementi del modulo (input & select) e inserisce i dati in un metodo CFC che li assegna a una struttura di sessione. La struttura viene restituita, rendendo i dati del modulo utilizzabili per la durata della sessione. L'app è adattata dal codice allo Raymond Camden's Using a server, or session storage, to persist form values.Sintassi di tag da CFScript a ColdFusion
Edizione: Il codice CFC originale è scritto in CFScript. Perché siamo su ColdFusion 8, ricevo un errore quando viene chiamato il metodo. Quindi, ho tradotto il metodo nella sintassi dei tag ColdFusion e ho smesso di ottenere quell'errore. In Dev Tools di Chrome, posso vedere i dati che passano al CFC tramite l'oggetto JSON ogni volta che inserisco qualcosa in un elemento del modulo. Quindi so che la funzione JavaScript sta funzionando. E anche se non ricevo errori di ritorno, ci sono alcuni comportamenti che mi portano a credere che la mia traduzione non sia corretta. Ad esempio, il dump della struttura della sessione mostra solo l'ultimo elemento di input inserito, piuttosto che tutti (come nel caso della demo di Ray).
Ecco la versione CFScript originale e quindi la mia traduzione di tag. Oltre ai commenti su dove la mia traduzione è sbagliata, mi piacerebbe avere una spiegazione di questa linea, <cfset s.name = [s[name]] />
, in particolare il costrutto [s[name]]
, dal momento che non sono in grado di articolare ciò che sta accadendo lì. Grazie.
sintassi dello script: sintassi
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;
}
}
tag:
<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 per menzionare il wrapping anziché la riscrittura – Leigh
Una cosa che devi fare in CF8 se ricordo è spostare i tuoi var nella parte superiore del blocco di script. Altrimenti, cfscript dovrebbe supportare tutte le notazioni moderne dell'oggetto così come sono. CF9 ti consente di var ovunque, come evidentemente ora si verifica il sollevamento in CF9 +. Lo modificherò per riflettere questo. – williambq
@ williambq - Potrebbe essere meglio aggiungere l'ultima parte come [modifica] (http://stackoverflow.com/posts/16948078/edit), quindi è più visibile. Quindi elimina il commento. – Leigh