1

我正在使用CF10。我有一个选择:

<cfselect name="company" id="company" query="qcompany" display="placename" value="placeid" queryposition="below">
                <option value="0">--Select--
</cfselect>

我有另一个 cfselect 绑定到第一个:

<cfselect  name="People" bind="cfc:schedule.GetPeopleArray({company})" ></cfselect>

我无法让第二个 cfselect 显示任何结果。为了测试我是否从我的组件接收数据(我将在底部显示),我绑定了一个文本框:

 <cfinput name="test" bind="cfc:schedule.GetPeopleArray({company})" bindonload="false"/>

此文本框每次都显示对我的组件的调用结果,但 cfselect 从不显示任何内容。

我可能做错了什么?

我尝试从我的组件返回数组和查询。没有帮助。我尝试将显示和值属性添加到第二个 cfselect。没有帮助。

这是我的组件:

<cfcomponent output="false">
<cffunction name="GetPeopleArray" access="remote" returnType="array" output="false">
    <cfargument name="company" type="string" >

    <!--- Define variables --->
    <cfset var data="">
    <cfset var result=ArrayNew(2)>
    <cfset var i=0>

    <cfquery name="qEmployee" datasource="texas" >
        SELECT 0 as personid,'Select Person' as fullname,0 as sortorder
        UNION
        SELECT p.personid ,concat(firstname,' ',lastname) as fullname,3 as sortorder
        FROM person p
        INNER JOIN placeperson pp
        ON p.personid=pp.personid
        where personstatus='ACT'
        and pp.placeid=#arguments.company#
        order by sortorder,fullname
    </cfquery>

    <!--- Convert results to array --->
    <cfloop index="i" from="1" to="#qEmployee.RecordCount#">
        <cfset result[i][1]=qEmployee.personid[i]>
        <cfset result[i][2]=qEmployee.fullname[i]>
    </cfloop>

    <!--- And return it --->
    <cfreturn result>
</cffunction>   
 </cfcomponent>
4

1 回答 1

1

最终,您可能还是想使用 jQuery,但是 FWIW 您现有的代码在 CF10 上运行良好。(为了简单起见,唯一的变化是删除了 JOIN)所以要么你使用不同的代码,要么还有其他我们不知道的事情发生..

说实话,Ajax 功能确实有一些“怪癖”。但是,对于这样的简单案例,您应该没有任何问题。除了添加文本字段之外,您还执行了哪些其他调试或故障排除步骤?我通常推荐的是:

  • 先独立测试CFC。使用各种示例值直接在浏览器中访问它:

    http://localhost/path/to/schedule.cfc?method=GetPeopleArray&company=someValue

    我使用原始代码执行此操作,发现当company值不是数字时发生错误,例如空字符串。(我怀疑这可能是问题所在)您可以通过替换像 0 这样的无效 ID 来防止该错误。注意,一定要使用cfqueryparam防止sql注入。

      AND  pp.placeid = <cfqueryparam value="#val(arguments.company)#" 
                                cfsqltype="cf_sql_integer">
    
  • 在 CF Administrator 中启用CF AJAX 调试器。然后附加?cfdebug到您的测试脚本,以便您可以查看控制台并检查问题/错误。

    http://localhost/path/to/yourTestForm.cfm?cfdebug

    同样,我在调整查询后这样做了。但是没有错误。您现有的 cfform 代码运行良好。

通常这两个步骤足以查明任何问题。如果没有,请确保您的Application.cfc 文件(如果您正在使用文件)没有干扰 Ajax 请求。这是一个常见的问题。在任何应用程序文件之外的单独目录中测试代码。

编辑:另外,您也可以设置bindonload="false"选择列表。由于您不想在页面首次加载时调用该函数。仅当用户从列表中选择某些内容时。

于 2013-04-17T21:27:22.247 回答