AJAX

2009-06-16 16 views
11

का उपयोग करके कोल्डफ्यूज़न फ़ंक्शन को आमंत्रित करें, जब उपयोगकर्ता किसी लिंक पर क्लिक करता है तो मुझे कोल्डफ्यूजन फ़ंक्शन (एक .cfm फ़ाइल में मौजूद) का आह्वान करने की आवश्यकता होती है। और मैं इसे jQuery का उपयोग करना चाहता हूं। मेरे पास एक jQuery स्निपेट है जो दिखता है-AJAX

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

)} 

मैं jQuery और AJAX दोनों के लिए नया हूं, इसलिए मैं यहाँ बेवकूफ लग सकता हूं। क्या मुझे कोल्डफ्यूजन फ़ंक्शन का आह्वान करने के लिए AJAX का उपयोग करना चाहिए? सर्वर पर एक विशिष्ट फ़ंक्शन निष्पादित करने का अनुरोध करने जैसा कुछ।

इस संबंध में किसी भी मदद की सराहना की जाती है।

चीयर्स।

+0

नीचे रैज्ड का जवाब देखें। थोड़ा उच्च स्तर पर, आप मूल रूप से केवल http अनुरोध कर रहे हैं और परिणाम के साथ कुछ कर रहे हैं। आप StackOverflow मुखपृष्ठ पर एक ही कॉल कर सकते थे और HTML को वापस प्राप्त कर सकते थे कि आपका ब्राउज़र होगा, लेकिन इसके बजाय आप कस्टम कोल्डफ्यूजन पृष्ठ पर कॉल कर सकते हैं और जो भी पृष्ठ लौटाता है उसे वापस प्राप्त करें। आप इसे HTML के रूप में छोड़ सकते हैं, या कोल्डफ्यूजन रिटर्न एक्सएमएल, जेएसओएन, या यहां तक ​​कि सादे पाठ भी कर सकते हैं। –

उत्तर

15

यदि आपके पास अपने सीएफएम में कई फ़ंक्शन हैं (भले ही आप नहीं करते हैं), तो उन्हें एक सीएफसी में रखें। फिर आप एक विशिष्ट विधि का आह्वान करने के लिए निम्न यूआरएल पैटर्न का उपयोग कर सकते हैं।

सीएफसी अपने उदाहरण कोड में करने के लिए 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> 

जावास्क्रिप्ट

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

मुझे एहसास है कि यह लगभग एक दशक पुराना है, लेकिन क्या आप समझा सकते हैं कि .cfc का उपयोग क्यों करें और एक .cfm फ़ाइल नहीं? –

+1

@tim_stuff अगर मुझे सही याद है, तो कोल्डफ्यूजन सीएफसी के आसपास स्वचालित रूप से एक वेब सेवा उत्पन्न करेगा: wsdl, आदि यह cfm के रूप में नहीं होता है। –

3

आप जरूरी "अजाक्स" (एक्सएमएल हिस्सा है, विशेष रूप से) का उपयोग करने की जरूरत नहीं है, लेकिन आप एक दूरस्थ सर्वर कॉल का उपयोग कर सकते हैं:

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

वास्तव में आप परिणाम के साथ क्या करने की जरूरत पर निर्भर करता है । ऊपर कोड अपने पृष्ठ पर एक div में एचटीएमएल परिणाम स्थापित करेंगे:

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

आप एक अतुल्यकालिक कॉल का उपयोग करें और XML को पार्स सकता है, लेकिन मैंने पाया कि मैं शायद ही कभी या तो जरूरत है।

15

आप वास्तव में क्या प्रयास कर रहे हैं ऐसा नहीं कर सकते नाम दिया है। हालांकि आपके पास कुछ विकल्प हैं।

विधि 1: दूर से सुलभ वस्तु

एक सीएफसी में अपने समारोह (रों) ले जाएँ, और सीएफसी का URL के माध्यम से उन तक पहुंचें। इस एक्सेस विधि के लिए आवश्यक है कि फ़ंक्शन अनुमति विशेषता access='remote' का उपयोग करें - यदि सार्वजनिक (डिफ़ॉल्ट) या निजी, (या पैकेज, या किसी भी भूमिका स्तर, आदि) पर सेट किया गया है तो आपको पहुंचने का प्रयास करते समय त्रुटि प्राप्त नहीं होगी यह दूरस्थ रूप से।

ऐसा करने के बाद, आप एक एसओएपी webservice बना रहे हैं और इसे AJAX के माध्यम से उपभोग कर रहे हैं।

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

आप ColdFusion 8 है, तो आप भी returnFormat='format' यूआरएल तर्क है, जो जो कुछ भी देशी ColdFusion डेटा आप पर अनुरोध किया प्रारूप पर लौटने वस्तुओं में परिवर्तित कर देंगे निर्दिष्ट कर सकते हैं: आप अपने jQuery अनुरोध में निम्न स्वरूप का उपयोग करके इस करते हैं मक्खी। यह जेएसओएन, एक्सएमएल, और डब्ल्यूडीडीएक्स का समर्थन करता है।

foo।सीएफसी

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

यूआरएल द्वारा प्रवेश:

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



विधि 2: रिमोट प्रॉक्सी वस्तु

# 1 दृष्टिकोण का नकारात्मक पक्ष है कि वहाँ एक मामूली है दक्षता सीएफसी पर दक्षता हिट, इसलिए यदि यह विशेष AJAX विधि बहुत बार चलती है, और/या आपके सीएफसी में कुछ तरीकों से अधिक है या कुछ सौ लाइनों से अधिक लंबा है, आप हर अनुरोध के लिए इसे चालू नहीं करना चाहते हैं। इसके बजाय, आप remote proxy pattern में देखना चाहते हैं, जहां आप सीएफसी को कैश करते हैं जो एप्लिकेशन स्कोप में कार्यक्षमता लागू करता है, और एक अलग 'रिमोट प्रॉक्सी' सीएफसी है जो बहुत हल्का वजन है, और केवल प्रॉक्सी (इसलिए नाम) http अनुरोध और कैश किए गए सीएफसी के बीच।

इस पैटर्न में, आपके व्यवसाय ऑब्जेक्ट (जिसमे वास्तविक कार्य करता है) में access=public (या पैकेज, आदि) हो सकता है, जब तक प्रॉक्सी तक पहुंच हो। हालांकि, प्रॉक्सी में 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> 

पहुँच यूआरएल द्वारा:

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



विधि 3: यह स्वयं करें

अंत में, आप मा सकता है फ़ंक्शन आमंत्रण को धीरे-धीरे कार्यान्वित करें और एक CFM टेम्पलेट में वापस आएं। इस विधि में एक सीएफसी लिखने के (मामूली) प्रदर्शन हिट शामिल नहीं है, लेकिन आपके लिए अधिक टाइपिंग और असफलता के अतिरिक्त संभावित बिंदु होंगे। ऐसा करने के लिए, सीएफएम टेम्पलेट में अपने कार्यों को शामिल करें, और आउटपुट स्ट्रीम को इस तरह से इलाज करें: टेक्स्ट की एक स्ट्रीम जो ब्राउज़र पर वापस आ जाएगी।

आपको वापसी मूल्य में व्हाइटस्पेस प्रबंधित करने के लिए सावधान रहना चाहिए (output=false फ़ंक्शन परिभाषाओं पर उपयोग करें, <cfsetting enableCFOutputOnly='true' का उपयोग करने पर विचार करें, और केवल अपने अंतर के बारे में सावधान रहें)। यदि आपका jQuery अनुरोध JSON को वापस करने की अपेक्षा करता है, तो आपको इसे क्रमबद्ध करने की आवश्यकता है। (यदि आपको कोल्डफ्यूजन 6 या 7 पर जेएसओएन को डेटा क्रमबद्ध करने की आवश्यकता है, तो मैं JSONUtil)

इस दृष्टिकोण के साथ, आप अपने AJAX अनुरोध को URL पैरामीटर के साथ .cfm फ़ाइल पर इंगित करते हैं, और फिर आपको कोड लिखने की आवश्यकता होती है उन यूआरएल पैरामीटर और उन्हें फ़ंक्शन में पास कर देते हैं, और उसके बाद फ़ंक्शन के परिणाम प्रदर्शित होते हैं (अनिवार्य रूप से, AJAX अनुरोध पर लौटते हैं)।

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 अच्छा शेयर एडम। –

8

बस इस पोस्ट को देखा। मैं गणना मूल्यों के गुच्छा को प्रदर्शित करने के लिए एक सीएफसी और jquery AJAX का उपयोग कर रहा हूँ। मेरे सीएफसी निम्नलिखित है:

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

मैं 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); 
     } 
    }); 

शायद, यह किसी और के लिए उपयोगी हो जाएगा ...

+0

'$ .ajax()' '.get()' के लिए एक अच्छा विकल्प है क्योंकि यह आपको अधिक विकल्प देता है, लेकिन वे दोनों काम करते हैं। – Ectropy

1

आप यदि चाहें तो CF8 में <cfajaxproxy> टैग कोशिश कर सकते हैं।

0

जावास्क्रिप्ट में कोल्डफ्यूजन चर का उपयोग करना शक्तिशाली है!

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

उपयोग करने के लिए अब आप CFAJAXPROXY

का उपयोग कर javaScriptVar के रूप में अपने चर संदर्भित कर सकते हैं अपने टेम्पलेट

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

में यह शामिल करने के लिए जावास्क्रिप्ट की ओर अपनी कक्षा का उपयोग करना सुनिश्चित करें सुनिश्चित करें ।

आप हमें ऐसा पसंद करेंगे।

var JS_CFC_Obj; 

JS_CFC_Obj = new jsCFCclassName() 

अब आप उस सीएफसी के अंदर कार्यों को कॉल कर सकते हैं।

jsCFCclassName.functionName(javascript var); 

 संबंधित मुद्दे