2009-06-16 20 views
11

Ho bisogno di richiamare una funzione ColdFusion (presente in un file .cfm) quando l'utente fa clic su un collegamento. E mi piacerebbe farlo usando jQuery. Ho un frammento di jQuery che sembra come-Richiamare la funzione ColdFusion utilizzando AJAX

<script type="text/javascript"> 
$(document).ready(function(){ 
     $("td.ViewLink a").click(function(event){ 
     event.preventDefault(); 

)} 

Sono nuovo di entrambi jQuery e AJAX, quindi potrei sembrare ingenuo qui. Dovrei usare AJAX per invocare la funzione ColdFusion? Qualcosa come la richiesta di eseguire una funzione specifica sul server.

Qualsiasi aiuto in questo senso è apprezzato.

Cheers.

+0

Vedere la risposta di razzed qui sotto. A un livello leggermente più alto, stai semplicemente facendo una richiesta http e facendo qualcosa con il risultato. Avresti potuto fare la stessa chiamata alla homepage di StackOverflow e recuperare l'HTML che il tuo browser avrebbe, ma invece hai fatto la chiamata a una pagina Coldfusion personalizzata e tornare indietro qualunque pagina restituisse. Puoi lasciarlo come HTML o far restituire XML, JSON o anche il testo normale a Coldfusion. –

risposta

15

Se hai più funzioni nel tuo cfm (anche se non lo fai), inseriscile in un cfc. Quindi è possibile utilizzare il seguente pattern URL per richiamare un metodo specifico.

cfc nominato myEntityWS.cfc

<cfcomponent> 
    <cffunction name="updateDescription" access="remote" returntype="string"> 
    <cfargument name="value" type="string" required="yes"> 
    <cftry> 
     your code here 
    <cfcatch> 
     <cfoutput> 
     #cfcatch.Detail#<br /> 
     #cfcatch.Message#<br /> 
     #cfcatch.tagcontext[1].line#:#cfcatch.tagcontext[1].template# 
     </cfoutput> 
    </cfcatch> 
    </cftry> 
    </cffunction> 
</cfcomponent> 

Javascript

$.get('myEntityWS.cfc?method=updateDescription&value=someValue'); 
+0

Mi rendo conto che questo ha quasi un decennio, ma potresti spiegare perché utilizzare un file .cfc e non un file .cfm? –

+1

@tim_stuff Se ricordo correttamente, ColdFusion genererà automaticamente un servizio Web attorno a cfc: wsdl, ecc. Ciò non accade in cfm. –

3

Non è necessariamente bisogno di utilizzare "AJAX" (la parte XML, in particolare), ma è possibile utilizzare una chiamata server remoto:

$.get('/execute-function.cfm?func=whatever', function (result) { $('#result').html(result); }); 

in realtà dipende da ciò che è necessario fare con il risultato . Il codice qui sopra porre il risultato HTML in un div nella pagina:

<div id="result"></div> 

Si potrebbe utilizzare una chiamata asincrona e analizzare XML, ma ho scoperto che raramente ho bisogno di entrambi.

15

Non si può fare esattamente quello che stai cercando di nel codice esempio. Hai alcune opzioni, però.

Metodo 1: a distanza oggetto accessibile

Spostare la funzione (s) in un CFC, e accedervi tramite l'URL del CFC. Questo metodo di accesso richiede che la funzione utilizzi l'attributo di autorizzazione access='remote' - se impostato su pubblico (predefinito) o privato, (o pacchetto, o qualsiasi livello di ruolo, ecc.) Verrà visualizzato un errore di metodo non trovato durante il tentativo di accesso da remoto.

In questo modo, si crea un servizio Web SOAP e lo si consuma tramite AJAX. A tale scopo, utilizzando il seguente formato nella richiesta jQuery:

http://domain.com/path/to/your.cfc?method=functionName&argument1=arg1Val&foo=bar&... 

Se si dispone di ColdFusion 8, è anche possibile specificare l'argomento returnFormat='format' URL, che permette di convertire qualsiasi oggetti dati ColdFusion nativo si torna al formato richiesto su il volo. Supporta JSON, XML e WDDX.

foo.cfc

<cfcomponent output="false"> 
    <cffunction name="foobar" output="false" access="remote" hint="..."> 
    <cfargument name="arg1" type="string" required="true" /> 
    ... 
    <cfreturn someVar /> 
    </cffunction> 
</cfcomponent> 

Accesso con URL:

http://domain.com/path/to/foo.cfc?method=foobar&arg1=some%20value&returnFormat=JSON 



Metodo 2: oggetto proxy remoto

Il lato negativo di approccio # 1 è che c'è una leggera colpo di efficienza su istanziazione di CFC, quindi se questo particolare metodo AJAX verrà eseguito molto frequentemente, e/o il tuo CFC contiene più di alcuni metodi o è più lungo di un paio di centinaia di righe, non vuoi istanziarlo più e più volte per ogni richiesta. Invece, dovresti esaminare lo remote proxy pattern, dove memorizzi nella cache il CFC che implementa la funzionalità in ambito Application e avere un CFC separato 'proxy remoto' che è molto più leggero, e agisce semplicemente come come proxy (quindi il nome) tra la richiesta http e il CFC memorizzato nella cache.

In questo modello, il tuo oggetto business (quello che ha la funzione che fa il vero lavoro) può avere access=public (o pacchetto, ecc.), Purché il proxy abbia accesso ad esso. Il proxy stesso deve avere access=remote, tuttavia.

proxy.cfc

<cfcomponent output="false"> 
    <cffunction name="foobar" output="false" access="remote" hint="..."> 
    <cfargument name="arg1" type="string" required="true" /> 
    <!--- Application.foo is an instantiated object of foo.cfc ---> 
    <cfreturn Application.foo.foobar(argumentCollection=arguments) /> 
    </cffunction> 
</cfcomponent> 

Accesso con URL:

http://domain.com/path/to/proxy.cfc?method=foobar&arg1=some%20value&returnFormat=JSON 



Metodo 3: Do It Yourself

Infine, si potrebbe ma implementare in modo sfumato la funzione invocazione e ritorno in un modello CFM. Questo metodo non comporta il (leggero) impatto sulle prestazioni della scrittura di un CFC, ma sarà più tipografico per te e ulteriori potenziali punti di errore. Per fare ciò, includi le tue funzioni nel modello CFM e considera il flusso di output proprio come questo: un flusso di testo che verrà restituito al browser.

È necessario fare attenzione a gestire gli spazi bianchi nel valore restituito (utilizzare output=false sulle definizioni di funzione, prendere in considerazione l'utilizzo di <cfsetting enableCFOutputOnly='true' e fare solo attenzione alla spaziatura complessiva). Se la tua richiesta jQuery si aspetta JSON, devi serializzarlo. (Se è necessario serializzare i dati su JSON su ColdFusion 6 o 7, si consiglia di JSONUtil)

Con questo approccio, si punta la richiesta AJAX al file .cfm con i parametri URL, e quindi è necessario scrivere il codice che richiede questi parametri url e li passa nella funzione, quindi visualizza (essenzialmente, restituisce alla richiesta AJAX) il risultato della funzione.

foo.cfm

<cfsetting enableCFOutputOnly="true"> 
<cfparam name="arg1" default="defaultVal"/> 

<cffunction name="foobar" output="false" access="remote" hint="..."> 
    <cfargument name="arg1" type="string" required="true" /> 
    ... 
    <cfreturn someVar /> 
</cffunction> 

<cfset variables.result = foobar(url.arg1) /> 
<cfoutput>#serializeJSON(variables.result)#</cfoutput> 
+1

+1 Nice share Adam. –

8

appena visto questo post. Sto usando un cfc e jquery ajax per visualizzare un gruppo di valori calcolati. mio cfc ha il seguente:

<cfcomponent output="true"> 
<cfscript> 
    this.init(); 
</cfscript> 
    <cffunction name="init" access="public" returntype="any"> 
     <cfset variables.dsn = application.dsn> 
     <cfreturn variables.dsn> 
    </cffunction> 
    <cffunction name="getFinanceTerms" access="remote" output="true" returntype="void"> 
     <cfargument name="sales_price" type="numeric" required="yes"> 
     <cfargument name="interestRate" type="numeric" required="yes"> 
      <!--- some calculations here ---> 
     #arguments.salesPrice# <!--- just to have something displayed ---> 
     <cfreturn> 
    </cffunction> 
</cfcomponent> 

io uso JQuery.Ajax:

$.ajax({ 
     type:"POST", 
     url:"financeTerms.cfc?method=getFinanceTerms", 
     data: "sales_price=55000&interestRate=5.99", 
     cache:false, 
     success: function(msg) { 
     $("#someDiv").html(msg); 
     } 
    }); 

Forse, sarà utile a qualcun altro ...

+0

'$ .ajax()' è una buona alternativa a '$ .get()' perché ti offre più opzioni, ma entrambe funzionano. – Ectropy

1

Puoi provare <cfajaxproxy> tag CF8, se volete.

0

L'utilizzo di una variabile ColdFusion in JavaScript è potente! Assicurarsi di utilizzare

<cfoutput> var #toScript(ColdFusionVAR, 'javascriptVar')# </cfoutput> 

È ora possibile fare riferimento la variabile come javaScriptVar utilizzando CFAJAXPROXY

Assicurati di includere questo nel vostro modello

<head> 
<cfajaxproxy cfc="cfc.yourclassname" jsclassname="jsCFCclassName"> 
</head> 

Utilizzando la classe sul lato JavaScript.

Ci piacerebbe così.

var JS_CFC_Obj; 

JS_CFC_Obj = new jsCFCclassName() 

Ora è possibile effettuare chiamate a funzioni all'interno di quel cfc.

jsCFCclassName.functionName(javascript var); 
Problemi correlati