Вызвать функцию ColdFusion с помощью AJAX - PullRequest
12 голосов
/ 16 июня 2009

Мне нужно вызвать функцию ColdFusion (присутствует в файле .cfm), когда пользователь нажимает на ссылку. И я хотел бы сделать это с помощью jQuery. У меня есть фрагмент jQuery, который выглядит как -

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

)}

Я новичок как в jQuery, так и в AJAX, поэтому я могу показаться наивным здесь. Должен ли я использовать AJAX для вызова функции ColdFusion? Что-то вроде запроса на выполнение определенной функции на сервере.

Любая помощь в этом отношении приветствуется.

Приветствие.

Ответы [ 6 ]

17 голосов
/ 16 июня 2009

Если в вашем cfm есть несколько функций (даже если у вас их нет), поместите их в cfc. Затем вы можете использовать следующий шаблон URL для вызова определенного метода.

cfc с именем 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');
15 голосов
/ 16 июня 2009

Вы не можете делать именно то, что пытаетесь сделать в своем примере кода. У вас есть несколько вариантов.

Метод 1: Удаленно доступный объект

Переместите ваши функции в CFC и получите к ним доступ через URL-адрес CFC. Этот метод доступа требует, чтобы функция использовала атрибут разрешения access='remote' - если установлено общедоступное (по умолчанию) или частное (или пакет, или любые уровни роли и т. Д.), То при попытке выполнить метод не найден чтобы получить к нему удаленный доступ.

Делая это, вы создаете веб-сервис SOAP и используете его через AJAX. Вы делаете это, используя следующий формат в вашем запросе jQuery:

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

Если у вас ColdFusion 8, вы также можете указать аргумент returnFormat='format' url, который будет преобразовывать любые собственные объекты данных ColdFusion, которые вы возвращаете, в запрошенный формат на лету. Он поддерживает JSON, XML и 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>

Доступ по URL:

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



Метод 2: Удаленный прокси-объект

Негативная сторона подхода # 1 заключается в том, что при создании экземпляров CFC наблюдается незначительное снижение эффективности, поэтому, если этот конкретный метод AJAX будет выполняться очень часто, и / или ваш CFC будет содержать несколько методов или длиннее, чем метод. пара сотен строк, вы не хотите создавать его снова и снова для каждого запроса. Вместо этого вы захотите взглянуть на шаблон удаленного прокси , где вы кэшируете CFC, который реализует функциональность в области приложения, и имеете отдельный CFC «удаленный прокси», который гораздо легче и просто действует в качестве прокси (отсюда и имя) между запросом http и кэшированным CFC.

В этом шаблоне ваш бизнес-объект (тот, у которого есть функция, выполняющая реальную работу) может иметь 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>

Доступ по URL:

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



Метод 3: Сделай сам

Наконец, вы можете вручную реализовать вызов функции и вернуться в шаблон CFM. Этот метод не включает (незначительное) снижение производительности при написании CFC, но будет более типичным для вас и дополнительными потенциальными точками отказа. Для этого включите свои функции в шаблон CFM и обработайте выходной поток как всего лишь: поток текста, который будет возвращен браузеру.

Вы должны быть осторожны, чтобы управлять пробелами в возвращаемом значении (используйте output=false в определениях функций, рассмотрите возможность использования <cfsetting enableCFOutputOnly='true' и просто будьте осторожны с вашим интервалом в целом). Если ваш запрос jQuery ожидает возвращения JSON, вам нужно его сериализовать. (Если вам нужно сериализовать данные в JSON в ColdFusion 6 или 7, я рекомендую JSONUtil )

При таком подходе вы указываете свой запрос AJAX на файл .cfm с параметрами URL, а затем вам нужно написать код, который принимает эти параметры URL и передает их в функцию, а затем отображает (по существу, возвращает в 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>
8 голосов
/ 23 июня 2009

Только что увидел этот пост. Я использую cfc и jquery ajax для отображения набора рассчитанных значений. Мой CFC имеет следующее:

<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);
      }
  });

Возможно, это будет кому-то еще полезно ...

3 голосов
/ 16 июня 2009

Вам не обязательно использовать «AJAX» (в частности, часть XML), но вы можете использовать вызов удаленного сервера:

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

Действительно зависит от того, что вам нужно сделать с результатом. Приведенный выше код поместит результат HTML в div на вашей странице:

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

Вы можете использовать асинхронный вызов и анализировать XML, но я обнаружил, что мне редко нужно либо.

1 голос
/ 24 июня 2009

Вы можете попробовать <cfajaxproxy> тег в CF8, если хотите.

0 голосов
/ 22 января 2013

Использование переменной ColdFusion в JavaScript - это мощно! Обязательно используйте

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

Теперь вы можете ссылаться на вашу переменную как javaScriptVar, используя CFAJAXPROXY

Не забудьте включить это в свой шаблон

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

Использование вашего класса на стороне JavaScript.

Ты бы нам так хотел.

var JS_CFC_Obj;

JS_CFC_Obj = new jsCFCclassName()

Теперь вы можете выполнять вызовы функций внутри этого cfc.

jsCFCclassName.functionName(javascript var);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...