【问题标题】:Populate Select list with AJAX使用 AJAX 填充选择列表
【发布时间】:2023-04-06 04:38:01
【问题描述】:

所以我是一个真正的 JQUERY 新手,所以请放轻松。

我想使用从 CFC 返回的数据填充 CFSELECT。这是我的工作 CFC:

<cfcomponent>
<cffunction name="getDescriptions" access="remote" returnformat="json" returntype="string" output="false">
    <cfquery name="customDescriptions" datasource="#datasource#">
        select description
        from service_descriptions
        where description <>"ADD NEW"
        order by description
     </cfquery>

    <cfset data = serializeJSON(customDescriptions)>
    <cfreturn data>
</cffunction>

以下是从我的 CFC 中返回数据的方式:

---->从列表中选择

我正在努力使用我的 AJAX 代码来填充我的 CFSELECT 表单元素。

<cfselect name="descriptionDD4" id="descriptionDD4">
   <option value="add_new">ADD NEW</option>
</cfselect>

这是迄今为止我的 AJAX 所拥有的,但它不起作用。

 <script>
       $(document).ready(function CheckAjaxCall()
            {
                $.ajax({
                    type:'POST',
                    url:'cfcs/get_descriptions.cfc?method=getDescriptions',                    
                    dataType:'json',
                    cache:false,
                    success:function(customDescriptions){ 

                $('##descriptionDD4').get(0).options.length = 0;
                $('##descriptionDD4').get(0).options[0] = new Option("--Select--", "0");        

                $.each(description, function(i,item) {
                                    $('##descriptionDD4').get(0).options[$('##descriptionDD4').get(0).options.length] = new Option(item[i].Name, item[i].roll);
                                                                                                                    // Display      Value
                            });

                            },
                            //error:function(){alert("Connection Is Not Available");}
                        });

                        return false;
                    });
            </script>

任何帮助将不胜感激。谢谢。 -布赖恩

【问题讨论】:

  • 有一种更简单的方法来填充您的 cfselect。只需使用 ColdFusion。不需要 json、ajax、javascript 和其他任何复杂的东西。
  • @Brian - &lt;cfselect&gt; 只是一个普通 html 选择的包装器,其中包括一些基于 不同(和更旧的)javscript 库而不是 jQuery 的笨拙 UI 代码。由于您使用的是 jQuery,因此请放弃 &lt;cfselect&gt; 并改用 &lt;select&gt;
  • 是的,我知道使用 CFSELECT 的绑定或查询功能更容易,但是当此页面上的某些其他元素通过 AJAX 调用(没有页面)发布时,我需要刷新此 CFSELECT 中的数据刷新)。我的目标是通过在不同的 AJAX 发布成功时调用填充它的函数来刷新它。我觉得我很接近代码,对吧?
  • 你写的代码不需要cfselect所以停止使用它。你应该避免使用任何 CF UI 元素,它们充满了问题、糟糕的实现和有限的功能。可能的问题是您没有以预期的格式返回数据。仅对查询进行 JSON 处理很少(如果有的话)是客户端所期望的格式。查看使用 Chrome 开发工具或 Firefox 中的 FireBug 返回的数据,了解我的意思。
  • 另外,在你的函数中,你有returnformat="JSON",然后你在返回之前序列化数据。摆脱serializeJSON() 调用并返回customDescriptions。或者摆脱两者并将returnFormat=json 添加到 AJAX 调用本身。这样,该函数可以服务于多种用途。

标签: jquery ajax coldfusion


【解决方案1】:

注意:默认情况下,CF 序列化查询的方式很不稳定。从长远来看,您可能希望自己滚动并返回更典型(和直观)的东西,例如结构数组。但仍然值得了解为什么您当前的代码不起作用,IMO。

问题:

作为Scott pointed out,最大的问题是您的javascript 代码需要一种格式,但您的cfc 却返回了另一种格式。您需要更改其中之一,以便它们同步。另外,正如我在 cmets 中提到的,使用 cfselect 在这里不会给您带来任何好处,所以只需使用纯 html select 代替。

调试:

在您对来自 CFC 的响应进行任何操作之前,您需要了解它发回的内容的格式。简单开始。只需在页面加载时调用cffunction 并将响应记录到控制台。您可以稍后在它工作后将所有内容包装在一个函数中。

<script type="text/javascript">
$(document).ready(function(){
    // Important: Must append the parameter "&returnformat=json"
    $.ajax({
       url: 'cfcs/get_descriptions.cfc?method=getDescriptions&returnformat=json'
       , dataType: 'json'
       , success: function(response){
           console.dir(response);
       },
       error: function(msg){
           console.log(msg);
       }
    })
}); 
</script>

使用 FF 的 Web 控制台,您将看到一个包含两个键的结构:COLUMNSDATA

DATA 是一个多维数组,包含您的查询结果。它按行号和列号索引。您可以循环遍历它,就像在 CF 中一样。唯一的区别是索引将从零开始(当然键名在 JS 中区分大小写)。将以下代码添加到您的 success 函数中,您将看到 Web 控制台中显示的查询值。

 // display values for debugging purposes
 for (var i = 0; i < response.DATA.length; i++){
    console.log("value in row ["+ i +"] column [0] = "+ response.DATA[i][0]);
 }

用法:

一旦您了解了如何访问数据,只需使用它来填充列表即可。您可以使用for 循环单独附加选项,或者使用the method described hereDATA 数组插入$.each 函数。由于您的查询仅返回一列,因此我将它用于选项文本和值。

$.each(response.DATA, function(i, row){
            // get value in first column ie "description"
            var description = row[0];

            // append new option to list
            $("#descriptionDD4").append($('<option/>', { 
                    value: description,
                    text : description 
            }));
        });

剩下的就是将 ajax 调用包装在一个函数中,您可以在任何需要的地方调用。但是你应该能够自己弄清楚那部分。

希望这对使用 jQuery 的远程 cffunctions 有所帮助。

【讨论】:

  • 非常感谢 Leigh 的洞察力。我会处理这个并报告。
  • 这很好用,我想我现在开始明白了。对于像我这样的新手来说,你的一点点努力会有很长的路要走。再次感谢您花时间提供如此详细的解释!
  • 我已经发布了我的工作 AJAX 代码。我将它从匿名函数更改为自定义函数,以便我可以从其他代码中调用它。因此,要从另一个 AJAX 调用的成功代码中调用此函数,我只需使用 PopulateSelectLists();在成功部分正确吗?
  • 最好将整个$.ajax 块包装在一个单独的 函数中,在$(document).ready(...) 之外。然后在页面加载时调用该函数,即在.ready 内,以及在您需要刷新列表时调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多