2009-06-16 16 views
11

Potrzebuję wywołać funkcję ColdFusion (obecną w pliku .cfm), gdy użytkownik kliknie łącze. I chciałbym to zrobić za pomocą jQuery. Mam fragment kodu jQuery, który wygląda jak-Wywołanie funkcji ColdFusion przy użyciu AJAX

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

)} 

Jestem nowym zarówno jQuery i AJAX, więc może wydawać naiwne tutaj. Czy powinienem używać AJAX do wywoływania funkcji ColdFusion? Coś jak żądanie wykonania określonej funkcji na serwerze.

Każda pomoc w tym zakresie jest doceniana.

Pozdrawiam.

+0

Zobacz odpowiedź razzed poniżej. Na nieco wyższym poziomie, po prostu tworzysz zapytanie http i robisz coś z wynikiem. Mogłeś wykonać to samo połączenie ze stroną główną StackOverflow i odzyskać kod HTML przeglądarki, ale zamiast tego nawiązujesz połączenie z niestandardową stroną ColdFusion i odzyskujesz to, co ta strona zwróci. Możesz zostawić to jako HTML, albo mieć ColdFusion zwracający XML, JSON, a nawet zwykły tekst. –

Odpowiedz

15

Jeśli masz wiele funkcji w swoim pliku cfm (nawet jeśli tego nie robisz), umieść je w pliku cfc. Następnie można użyć następującego wzoru adresu URL, aby wywołać określoną metodę.

CFC nazwie 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

Zdaję sobie sprawę, że minęło już prawie dziesięć lat, ale czy mógłbyś wyjaśnić, dlaczego używasz pliku .cfc, a nie pliku .cfm? –

+1

@tim_stuff Jeśli dobrze pamiętam, ColdFusion będzie generować usługę internetową automagicznie wokół cfc: wsdl itp. To nie zdarza się z cfm. –

3

Nie koniecznie trzeba używać „Ajax” (część XML, a konkretnie), ale można korzystać ze zdalnego połączenia z serwerem:

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

naprawdę zależy od tego, co trzeba zrobić z wynikiem . Powyższy kod HTML umieścić wynik w div na stronie:

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

Można użyć asynchronicznego połączenia i analizowania XML, ale odkryłem, że ja rzadko trzeba albo.

15

nie można zrobić dokładnie to, co starasz się w przykładowym kodzie. Masz jednak kilka opcji.

Metoda 1: Zdalnie dostępny obiekt

Najedź funkcję (-ów) do CFC, a dostęp do nich za pośrednictwem adresu URL CFC. Ta metoda dostępu wymaga, aby funkcja korzystała z atrybutu uprawnień access='remote' - jeśli jest ustawiona jako publiczna (domyślna) lub prywatna ((lub pakiet, lub dowolne poziomy ról itp.), Otrzymasz komunikat o błędzie metody, który nie został znaleziony podczas próby uzyskania dostępu to zdalnie.

W ten sposób tworzysz usługę internetową SOAP i używasz jej przez AJAX. Można to zrobić za pomocą następującego wzoru we wniosku jQuery:

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

Jeśli masz ColdFusion 8, można również określić argument returnFormat='format' zawartości, co będzie przekształcić cokolwiek rodzimy danych ColdFusion obiektów wrócisz do żądanego formatu na Mucha. Obsługuje JSON, XML i 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> 

Dostęp URL:

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



Metoda 2: Zdalny obiekt proxy

Negatywna strona podejście # 1 jest to, że istnieje niewielkie Efektywność w tworzeniu instancji CFC, więc jeśli ta konkretna metoda AJAX będzie uruchamiana bardzo często i/lub Twoja CFC zawiera więcej niż kilka metod lub jest dłuższa niż kilkaset linii, nie chcesz tworzyć jej w kółko dla każdego żądania. Zamiast tego warto zajrzeć do wersji remote proxy pattern, w której buforowane jest CFC, które implementuje funkcjonalność w zakresie aplikacji, i mają osobną "CFC zdalnego serwera", która jest znacznie lżejsza i po prostu działa jako jako proxy (stąd nazwa) między żądaniem http a pamięcią podręczną CFC.

W tym wzorze obiekt biznesowy (ten, który ma funkcję wykonującą prawdziwą pracę) może mieć access=public (lub pakiet itp.), O ile serwer proxy ma do niego dostęp. Sam serwer proxy musi jednak mieć numer access=remote.

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> 

Dostęp URL:

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



Metoda 3: Do It Yourself

Wreszcie, można MA natywnie zaimplementuj wywołanie funkcji i zwróć ją w szablonie CFM. Ta metoda nie wiąże się z (niewielkim) trafieniem wydajności pisania CFC, ale będzie dla Ciebie pisaniem częściej i dodatkowymi potencjalnymi punktami awarii. Aby to zrobić, umieść swoje funkcje w szablonie CFM i traktuj strumień wyjściowy jako: strumień tekstu, który zostanie zwrócony przeglądarce.

Powinieneś zachować ostrożność, zarządzając białymi znakami w wartości zwracanej (użyj output=false dla definicji funkcji, rozważ użycie opcji <cfsetting enableCFOutputOnly='true' i zachowaj ostrożność w ogólnym rozstawie). Jeśli twoje żądanie jQuery oczekuje JSON z powrotem, musisz serializować go. (Jeśli potrzebujesz serializować dane do JSON na ColdFusion 6 lub 7, polecam JSONUtil)

Przy takim podejściu wskaż twoje żądanie AJAX do pliku .cfm z parametrami URL, a następnie musisz napisać kod, który te parametry adresu URL i przekazuje je do funkcji, a następnie wyświetla (w zasadzie zwraca do żądania AJAX) wynik działania.

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 Niezły udział Adam. –

8

Właśnie zobaczyłem ten post. Używam cfc i ajax jquery, aby wyświetlić kilka obliczonych wartości. Moja CFC ma następujący:

<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> 

używam 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); 
     } 
    }); 

Może to być przydatne dla kogoś innego ...

+0

'$ .ajax()' jest dobrą alternatywą dla '$ .get()', ponieważ daje ci więcej opcji, ale oba działają. – Ectropy

1

Możesz spróbować <cfajaxproxy> tag w CF8 jeśli chcesz.

0

Używanie zmiennej ColdFusion w JavaScript jest potężne! Należy używać

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

Teraz można odwołać swoją zmienną jako javaScriptVar użyciu CFAJAXPROXY

Pamiętaj, aby podać ten w szablonie

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

Korzystanie z klasy po stronie JavaScript.

Ty byś nam to tak.

var JS_CFC_Obj; 

JS_CFC_Obj = new jsCFCclassName() 

Możesz teraz wykonywać połączenia z funkcjami wewnątrz tego cfc.

jsCFCclassName.functionName(javascript var); 
Powiązane problemy