如何从cfc页面返回数据?

时间:2016-09-30 13:06:55

标签: javascript ajax coldfusion

我有项目,我想使用标准的Javascript Ajax Call从我的.cfc页面获取数据。后来我和JQuery合作过,现在我想看看有什么区别。所以我的javascript代码在用户点击下拉列表(onChnage函数)后被触发,我在该函数中传递参数。然后我有我的Ajax调用,到目前为止这部分内容都运行良好。现在我将方法和参数发送到.cfc页面,我的Coldfusion函数在哪里。在那里,我定义了我的agrument,我有cfquery。所以我的问题是如何创建JSON结构并返回到我的Javascript函数,我可以循环遍历这些元素?这是我的Ajax调用:

function myFunction(userNum){
    var xmlhttp = new XMLHttpRequest();

    xmlhttp.onreadystatechange = function() {
         if(xmlhttp.status == 200) {
               console.log(xmlhttp.responseText)
               var data = JSON.parse(xmlhttp.responseText);

               for(var i=0; i < data.length; i++){
                    alert(i);
                }

         }else{
             alert('There was an error 400');
         }
    }

    xmlhttp.open("GET", "Components/myCFCpage.cfc method=getRecs&userNum="+userNum.value, true);
    xmlhttp.send();
}

所以在上面的函数中我有一个关于发送url参数的问题。是最好的方法来实现它在我的函数中应该是在xmlhttp.send()中吗?如果是这样有什么区别?我也应该检查状态&#34; 200&#34;它的方式或可以通过其他方式完成的方式? 这是我的cfc页面:

<cfcomponent>
    <cffunction name="getRecs" access="remote" returntype="JSON">
        <cfargument name="userNum" type="string" required="yes">

        <cfset cfcResults = structNew()>
        <cfset recs = StructNew()>

        <cfif arguments.userNum NEQ ''>
            <cfquery datasource="test" name="getUser">
                SELECT user_id, first_name, last_name
                FROM Users
                WHERE user_id = <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.userNum#">
                ORDER BY last_name
            </cfquery>

            <cfset cfcResults.recordcount = getUser.recordcount>
            <cfloop query="getUser">
                <cfset recs[currentRow] = StructNew()>
                <cfset recs[currentRow].firstName = URLEncodedFormat(getUser.first_name)>
                <cfset recs[currentRow].lastName = URLEncodedFormat(getUser.last_name)>
            </cfloop>

            <cfset cfcResults.status = "200">
            <cfset cfcResults.data = recs>
        <cfelse>
            <cfset cfcResults.status = "400">
            <cfset cfcResults.message = "Error">            
        </cfif>

        <cfreturn cfcResults>
    </cffunction>
</cfcomponent>

我想知道我现在如何使用这些数据并在我的javascript函数中循环?在这种情况下,创建JSON的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

<cffunction name="getRecs" access="remote" returntype="any" returnFormat="JSON">
    <cfreturn cfcResults>
</cffunction>

JSON不是有效的returnType。请参阅CFFunction documentation。你想要returnFormat="JSON"

如果你有ColdFusion代码并执行<cfset myVar = getRecs()/>那么myVar的值将是一个结构。如果您对getRecs进行远程调用,ColdFusion将以指定的返回格式将数据返回给远程调用方。

无需额外做任何事情或手动序列化。

  

returnformat - 将值返回给远程调用者的格式。这个   属性对返回给本地调用者的值没有影响。

     

以下值有效:

     
      
  • json :在返回之前将返回值序列化为JSON格式   远程。

  •   
  • wddx :在远程返回之前将返回值序列化为WDDX格式。

  •   
  • plain :确保返回值是一种类型   ColdFusion可以直接转换为字符串,并返回   没有序列化的字符串值。有效类型包括所有简单   类型,例如数字和XML对象。如果返回值是a   复杂类型,如数组或二进制值,ColdFusion   生成错误。如果指定returntype属性,则为其值   必须是any, boolean, date, guid, numeric, string, uuid, variablename,   或XML;否则,ColdFusion会生成错误。默认情况下,   ColdFusion序列化所有返回类型(包括简单返回   除了XML之外,它们转换为WDDX格式,并以XML格式返回XML数据   文本。

  •   
     

您还可以使用returnformat作为HTTP请求参数   调用远程CFC功能。此参数具有相同的效果   returnformat属性并覆盖任何returnformat属性   cffunction标记中指定的值。