Не удается получить возврат от удаленного метода Coldfusion с помощью вызова jQuery ajax - PullRequest
3 голосов
/ 08 сентября 2011

Обновление2:

Здесь включен jQuery (вместе с текущим jQuery):

<script type="text/javascript" src="/honors/thesis_submission/js/jquery-ui.js"></script>

домен равен http://uwf.edu

$(document).ready(function() {
$('#advisor_email').autocomplete({source: "/honors/thesis_submission/cfc/advisors.cfc?method=advisorLookUp&returnFormat=json", minLength: 2});
});

Обновлен метод:

<cffunction name="advisorLookUp" access="remote" output = "false" returntype="any">
        <cfargument name="term" type="string" required="no">
        <cfset var advisorLookUp = "">
        <cfset var a = []>
        <cfset var s = {}>

        <cfquery name = "advisorLookUp" datasource = "#dsn#">
        SELECT id, email
        FROM budPerson
        WHERE email like <cfqueryparam cfsqltype="cf_sql_varchar" value = "#trim(arguments.term)#%">
        </cfquery>

        <cfloop query = "advisorLookUp">
            <cfset s = StructNew()>
            <cfset s["id"] = id>
            <cfset s["label"] = email>
            <cfset s["value"] = email>
            <cfset arrayAppend(a,s)>
        </cfloop>


        <cfreturn a>
    </cffunction>

Форма:

<cfform enctype="multipart/form-data" name = "coversheet">
<!-- other fields excluded -->
<input name="advisor_email" type="text" id="advisor_email" size="40"> 
<!-- other fields excluded -->
</cfform>

Обратите внимание еще раз ... Я смог добиться этого, поместив ТО ЖЕ код, который есть в моем методе, на обычную страницу cfm и простоcfoutputing ... странно много?: \ Я бы хотел, чтобы он работал через удаленный метод в моем cfc.

Обновление:

Переключитесь на пользовательский интерфейс jQuery и обновите мой код, чтобы он соответствовал ему.Я все еще не получаю ответ удаленно от моего метода.

-

Я пытаюсь настроить плагин jQuery Autocomplete (в частности: http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/).

Я бы просто использовал сборку coldfusion в автозаполнении, ноэто не работало для меня (выдавая ошибку, которая, очевидно, я ничего не могу с этим поделать.)

В любом случае, мой удаленный метод в моем cfc не даст мне ответа. Firebug действует так, как будто все хорошо и все такое, но на самом деле не дает мне возврата.

Вот моя функция:

<cffunction name="advisorLookUp" access="remote" returntype="any">
        <cfargument name="q" type="string" required="yes">
        <cfset var advisorLookUp = "">
        <cfset var arr = "">


        <cfquery name = "advisorLookUp" datasource = "#dsn#">
        SELECT id, email
        FROM budPerson
        WHERE email like <cfqueryparam cfsqltype="cf_sql_varchar" value = "#trim(arguments.q)#%">
        </cfquery>

        <cfsavecontent variable="arr">
        <cfoutput query = "advisorLookUp">
            #advisorLookUp.email# | #advisorLookUp.id# 
        </cfoutput>
        </cfsavecontent>

        <cfreturn arr>
</cffunction>

Я возвращаю форматирование так, как хочет плагин. Ну, на самом деле это не такЯ думаю, что ... я действительно хочу знать, что я получаю ответ (которого я сейчас не имею).

Вот мой jQuery, вызывающий метод:

$('#advisor_email').autocomplete(
     "/honors/thesis_submission/cfc/advisors.cfc?method=advisorLookUp&returnFormat=json");

Я протестировал метод без jQuery, просто выполняя вызов, и он прекрасно работает. Есть идеи?

Ответы [ 4 ]

5 голосов
/ 10 сентября 2011

Какую версию ColdFusion вы используете?Если не последняя (версия 9), то вам может понадобиться добавить следующий оператор if в метод onRequestStart () в вашем Application.cfc, чтобы устранить ошибку, из-за которой нарушается присутствие функции onRequest ()с удаленными вызовами:

<cffunction name="onRequestStart" returnType="boolean" output="false">
    <cfargument name="thePage" type="string" required="true">

    <!--- Other code in your onRequestStart method --->

    <!--- Add the following to the end of your onRequestStart method --->
    <cfif ListLast( arguments.thePage,"." ) IS "cfc">
        <cfset StructDelete( this, "onRequest" )>
        <cfset StructDelete( variables,"onRequest" )>
    </cfif>
    <cfreturn true>
</cffunction>

Определяет, выполняет ли запрос удаленный вызов cfc, и удаляет функцию onRequest.

(NB: убедитесь, что "arguments.thePage" соответствует любому объявленному вами именидля этого аргумента. Некоторые люди называют его TargetPage или тому подобное. Не имеет значения, если оно совпадает с именем, которое вы объявляете.)

0 голосов
/ 09 сентября 2011

Как упоминает Tentonaxe, установите для returnformat значение json, а CF позаботится о сериализации и возврате структуры в том, что выглядит в правильном формате (по крайней мере, для JQuery-версии AutoComplete)

0 голосов
/ 10 сентября 2011

Я предполагаю, что вы включили jquery перед jqueryui на своей странице вызова.В любом случае, это работает, на тестовой странице верните путь к вашему cfc

testpage.cfm

<html>
<head>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.3/jquery.min.js"></script>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js"></script>
</head>

<body>
<cfform name = "coversheet">
<!-- other fields excluded -->
<input name="advisor_email" type="text" id="advisor_email" size="40"> 
<!-- other fields excluded -->
</cfform>

<script>
$(document).ready(function() {
$('#advisor_email').autocomplete({source: "cfcs/advisors.cfc?method=advisorLookUp&returnFormat=json", minLength: 2});
});

</script>


</body>
</html>

advisors.cfc

<cfcomponent>

    <cffunction name="advisorLookUp" access="remote" output = "false" returntype="any">
        <cfargument name="term" type="string" required="no">
        <cfset var advisorLookUp = "">
        <cfset var a = []>
        <cfset var s = {}>
    <!--- no dsn so hardcode some data --->
        <cfset hardcodeData = queryNew("id, email")>
        <cfset queryAddRow(hardcodeData)>
        <cfset querySetCell(hardcodeData, "id", 1)>
        <cfset querySetCell(hardcodeData, "email", "petra@xyz.com")>
        <cfset queryAddRow(hardcodeData)>
        <cfset querySetCell(hardcodeData, "id", 2)>
        <cfset querySetCell(hardcodeData, "email", "pete@abc.com")>
        <cfset queryAddRow(hardcodeData)>
        <cfset querySetCell(hardcodeData, "id", 3)>
        <cfset querySetCell(hardcodeData, "email", "peter@abc.com")>

    <!--- now spoof the query --->
        <cfquery name = "advisorLookUp" dbtype="query">
                SELECT id, email
                FROM hardcodeData
                WHERE email like <cfqueryparam cfsqltype="cf_sql_varchar" value = "#trim(arguments.term)#%">
         </cfquery>


        <cfreturn advisorlookup> 
    </cffunction>
</cfcomponent>

Ввод "pe" вполе ввода генерирует это в ответах firebug

{"COLUMNS": ["ID", "EMAIL"], "DATA": [["1.0", "petra@xyz.com"], ["2.0 "," pete@abc.com "], [" 3.0 "," peter@abc.com "]]}

да возвращая запрос, вы могли бы возиться, если вы хотите, чтобы возвращаемый форматировался по-другому

как у тебя было

   <cfloop query = "advisorLookUp">
        <cfset s = StructNew()>
        <cfset s["id"] = id>
        <cfset s["label"] = email>
        <cfset s["value"] = email>
        <cfset arrayAppend(a,s)>
    </cfloop>

    <cfreturn a> 
0 голосов
/ 08 сентября 2011

После борьбы с этим .... Я решил просто поместить код Coldfusion в мой метод на странице (ajax.cfm) и выполнить удаленный вызов таким образом.Это работает ... сейчас.Однако, если кто-нибудь знает, как заставить это работать с удаленным вызовом метода в cfc, я был бы намного счастливее.

<cfparam name="url.term" default = "">
<cfset  a = []>
<cfset s = {}>

        <cfquery name = "advisorLookUp" datasource = "#dsn#">
        SELECT id, email
        FROM budPerson
        WHERE email like <cfqueryparam cfsqltype="cf_sql_varchar" value = "#trim(url.term)#%">
        </cfquery>

        <cfloop query = "advisorLookUp">
            <cfset s = StructNew()>
            <cfset s["id"] = id>
            <cfset s["label"] = email>
            <cfset s["value"] = email>
            <cfset arrayAppend(a,s)>
        </cfloop>

        <cfoutput>#serializeJSON(a)#</cfoutput>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...