【问题标题】:Coldfusion 11 Ajax CFC binding impossibleColdfusion 11 Ajax CFC 绑定不可能
【发布时间】:2015-09-01 01:30:39
【问题描述】:

我知道很多人在使用 Ajax 和旧版本的 Coldfusion 时遇到过问题,但我在本地机器上使用 Coldfusion 11 Developer,发现无法在任何情况下使用 Coldfusion 函数将其绑定到CFC,尽管返回的错误并不总是相同。

当 cfdiv 绑定到 CFC 时,我不能使用自动建议 - 但我可以绑定到同一页面上的自动建议数据,包括来自数据库的数据。当我绑定到 CFC 时,CFDebug 中的错误消息总是显示为

“错误:小部件:自动建议姓氏绑定失败,绑定值不是一维字符串数组。 info:http: CFC 调用响应:["Barken","Barnes"] ...

...您可以看到,绑定是一维字符串数组,CFC 生成了它们,但不会将它们返回到调用页面!

我还尝试让 CFC 变得更简单,删除数据库元素并手动创建一个简单的一维字符串数组,但出现与从我的数据库输入时相同的错误。

所以我做了一个更简单的测试,避免使用数据库和数组来测试普通、简单的绑定,不涉及自动建议——只是普通绑定到 CFC(我总是可以成功绑定到同一页面上的数据或 URL。 )

这是最简单的测试代码,还是不行:

<body>
<cfform id="myForm" name="myForm">
Enter your name into the box:<br />
<cfinput type="text" name="myText">
</cfform>
<hr />
Below is a cfdiv container, with a bind to a CFC:<br />
<cfdiv bind="cfc:bindsource.getDivContent({myText})"></cfdiv>
</body>

这是 CFC,名为 bindsource.cfc,与表单页面位于同一文件夹中:

<cfcomponent output="false">
<cffunction name="getDivContent" returntype="string" access="remote"  >
<cfargument name="edit">
<cfreturn "Your entered content was: #arguments.edit#">
</cffunction>
</cfcomponent>

在这种情况下,我得到的错误是: 窗口:全局:未捕获的异常:TypeError:无法将 '_289[i]' 转换为对象(http://localhost:8500/CFIDE/scripts/ajax/package/cfajax.js,第 872 行) info:http: CFC 调用响应:“您输入的内容是:William”

(William 是我在主页框中输​​入的文本。cfajax.js 中的第 872 行是“872 throw new SyntaxError("parseJSON")”

在这个简单的测试中,在我的主页上,无论是在我在文本输入中输入内容之前还是之后,在 cfdiv 的区域中,都会出现“未定义”一词。

有时,如果我在某些测试页面上没有得到 1D array of strings 错误,我会得到 this can't convert to object 错误。

我尝试过的所有示例——不仅仅是我自己的东西,而是我能找到的所有示例——运行,直到出现 Ajax 错误,所以没有其他语法错误。在所有情况下,表单页面加载并运行,CFC 似乎被调用,处理适当 - CFDebug 在调试窗口中向我显示 CFC 的正确输出 - 但随后没有任何内容返回到调用页面。如果我使用 url 绑定或相同的页面绑定,它会这样做 - 使用 CFC,它不会。永远。

当我在传递了方法和参数的直接 URL 中独立测试 CFC 时,它可以工作 - 我得到与 CFC 调用响应相同的结果。

有没有人在 Coldfusion 中使用过 CFC 绑定?我错过了什么还是 CF11 有缺陷?整个事情似乎有点不稳定。我也收到“找不到 CFC”错误,但如果我什么都不做,请关闭,重新启动 - 在会话稍后的某个时间,在重复尝试获取其中一个文件之后,相同文件不会再次发生该特定错误测试工作。

【问题讨论】:

  • 我有时将它与版本 9 一起使用,它工作正常。我使用的代码和你的类似。
  • 我在 CF11 上测试了你的代码,它运行良好。
  • 问题很可能是您正在使用 ColdFusion 客户端功能,这些功能直言不讳、执行不力、过时且功能严重受限。使用像 jQuery 这样的 JS 库会更好。它会更容易更新,并且会为您省去很多麻烦。
  • 过去,当我遇到您描述的问题时,是由于在应用程序级别引入了其他 javascript 代码。当您测试此类事情时,请确保您在Applcation.cfc 不会执行任何会干扰您的测试的目录。
  • 您是否为站点定义了 CFIDE 和 jakarta 虚拟目录?

标签: ajax coldfusion bind cfc


【解决方案1】:

哇 - 那是一个晦涩难懂的问题,但我现在知道是什么原因造成的。

感谢您的建议,尤其是来自@Dan Bracuk 的建议,其中提到 Application.cfc 文件中的 javascript 冲突,这让我想到了它,但它也有助于了解基本代码应该并且确实有效,正如其他人所建议的那样,所以这个问题显然与其他事情有关。

首先,我完全删除了我的 Application.cfc 文件 - 这是我第一次可以绑定到 cfc。那么问题来了,要找出 Application.cfc 中可能在做什么。

好吧,由于这是我的开发设置,我将一些变量转储到 Application.cfc 的 onRequestEnd 函数中的页面。通过删除它们 - 它可以工作。将它们中的任何一个放回去(服务器、cgi、会话、应用程序变量等的转储),然后 cfc 绑定将再次不起作用。

我没有将 onRequestEnd 用于除了变量转储之外的任何东西,但我想测试如果我这样做可能会发生什么,同时删除变量转储。所以我只是在 onRequestEnd 函数中添加了一个简单的 cfinclude(包含的 cfm 文件什么都不做 - 这是一个空的 cfm 框架页面,带有 doctype 和空的 head/body 标记,什么也不做或不输出),同样,cfc 绑定不起作用.

似乎 (onRequestEnd) 将直接在 onRequestEnd 中(但不在包含的文件中)接受 cfset a=2+1 之类的基本操作,并且 cfc 将绑定,但仅此而已(显然没有对您的内容进行详尽的测试仍然可以 - 基本上,如果你想绑定到你的 CFC,onRequestEnd 是非常不可用的。)

就是这样,如果要绑定到 CFC,则基本上不能依赖 onRequestEnd 函数。如果您只想使用它来执行数学或其他事情 - 也许您可以使用它。

希望这对其他人有所帮助。几周来一直让我发疯。

对于它的价值,人们可以比较他们自己的设置,以防它不适用于所有开发环境,我一直在使用 CF11 开发人员版,我正在使用内置的 Tomcat 服务器端口 8500。

再次感谢大家。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多