我们决定在模态对话框中使用cfWindows。这是不能改变的,所以“使用另一个框架”的回答和评论不会解决这个问题。
虽然我们打开了IP地址的调试,调试信息在普通页面上显示得很好,但cfWindows中没有显示任何内容。今天,我开始尝试重新创建调试信息,并手动将其写入HTML窗口。首先,我在onRequestEnd中使用了以下代码,这些代码在名为“normally”的页面上运行良好:
<cfset tempFactory = createObject("java", "coldfusion.server.ServiceFactory")>
<cfset tempCfdebugger = tempFactory.getDebuggingService()>
<cfset qEvents = tempCfdebugger.getDebugger().getData()>在花时间按需要格式化输出之后,我终于在cfWindow上尝试了这一点。但是,我在第三行代码中收到了以下错误:
Detail Its possible that a method called on a Java object created by CreateObject returned null.
ErrNumber 0
Message Value must be initialized before use.这意味着,不仅CF设置为不显示cfWindows中的调试信息,而且提供调试信息的cfWindows元素在cfWindows情况下也不起作用。我对底层Java知之甚少,我发布的代码是不久前从CF博客中提取的,所以我不知道如何解决这个问题。
是否有可能获得cfWindow中调用的页面的调试信息?如果是这样的话,是怎么做的?
编辑
为了跟进评论中的建议,我尝试在自己的浏览器窗口中打开CFWindow模板。调试信息显示为正常。然后,我尝试了CFDumping,这是上面列出的三行中每一行的结果。前两项工作。"tempCfdebugger“变量确实包含一个名为"getDebugger()”的函数。问题似乎是当在CFWindow中调用该函数时。服务器必须以某种方式对CFWindow请求进行不同的解释。
除了连接到ServiceFactory之外,是否有其他方法获取此调试信息?
发布于 2014-07-01 16:20:54
我将奖励斯科特,因为他正确地建议了_cf_nodebug url变量,它解决了最初的问题。然而,我想在这里发布一个更完整的答案。
Scott是正确的,我们可以在cfWindow中通过在调用时将_cf_nodebug=true附加到url来获得完整的调试信息(尽管我不清楚给定变量名称的逻辑)。这解决了最初问题中提到的问题,并且很容易添加到我们的cf_window自定义标记中;非常感谢斯科特。但是,当我们试图从所有cfWindow交互(包括AJAX请求)中获得调试信息时,我对这个问题的措辞很差。这最终是一个两阶段的修复,由_cf_nodebug负责第一阶段。
虽然我们现在能够从cfWindow的初始负载中获得调试信息,但是我们还需要修改cfc来报告查询的详细信息。我找不到允许我们从cfc访问serviceFactory的url变量,但考虑到它是一个cfc,并且本质上只是一个密集的查询集合,我能够向组件中添加以下函数来再现一些所需的功能:
<cffunction name="debugFunc" access="private" output="yes">
<cfparam name="session.debugEnabled" default="false">
<cfif session.debugEnabled>
<cfoutput>
<cfsavecontent variable="debugDetails">
Recordcount: #Request.getDataQueryResult.recordcount#<br>
Execution Time: #Request.getDataQueryResult.ExecutionTime#ms<br>
<cfif isDefined('Request.getDataQueryResult.sqlparameters')>
Params: #Request.getDataQueryResult.sqlparameters#<br>
</cfif>
<br>
#Request.getDataQueryResult.sql#
</cfsavecontent>
<script>
parent.cfWindowDebugDivAdd("cfWindow: #url.method#", "#ReplaceList(debugDetails, "#Chr(10)#,#Chr(13)#,""", " ")#");
</script>
</cfoutput>
</cfif>
</cffunction>然后,我在cfc中进行了搜索和替换,以修改大约100个cfQuery标记的开头和结尾:
<cfquery result="Request.getDataQueryResult" ...>
...
</cfquery>
<cfset debugFunc()>这会将查询信息存储在请求范围中的一个结构中,然后调用上面的调试函数来编写一些JS,将其传递回父页面。然后,您只需要在父页面上设置一个函数来获取调试信息并将其转储到div、span或浏览器控制台中。如果它对其他人有帮助,下面是我用于测试的代码:
<div id="cfWindowDebugDiv" style="width:1000px; height:300px; overflow:auto; text-align:left;"></div>
<script>
function cfWindowDebugDivAdd(heading, details) {
$("#cfWindowDebugDiv").append("<b><u>" + heading + "</u></b><br>");
$("#cfWindowDebugDiv").append(details + "<br><br><br><br>");
}
</script>发布于 2014-06-13 21:13:50
Cfwindow和其他AJAX特性更难调试(不仅仅是ColdFusion AJAX)。对于cfwindow,可以将其添加到URL中:
?cfdebug
更完整的解释是这样做的:
US/ColdFusion/9.0/Developing/WSc3ff6d0ea77859461172e0811cbec10e40-8000.html
我还建议了解如何使用Firebug。它确实需要一些时间来学习,但对于其他项目(标准的jQuery/AJAX)来说,它将是有用的。值得花时间学习。
您将收到关于此类开发的其他平台/策略的评论。我已经被使用内部、cfinput等功能烧坏了。我发现学习jQuery是痛苦的,但是当我升级到ColdFusion的新版本时,它克服了它带给我的痛苦。我还遇到了一些与cfwindow浏览器兼容的问题。
更新:--我认为通过将代码添加到OnRequestEnd()中,就破坏了CF调用的正常操作。把我的评论读到Ben的博客上,关于我遇到的麻烦(打开这个链接后搜索jibben )。
http://forta.com/blog/index.cfm/2007/6/4/ColdFusion-Ajax-Tutorial-4-Partial-Page-Updates
短版本:使用OnRequestEnd()添加内容输出的将中断calls调用,因为其中许多调用都需要JSON或其他格式化数据。在这个函数中添加一个简单的"hello“将把它附加到数据流中,并破坏预期的格式设置。
我建议将您的调试转储添加到cfwindow在源属性中调用的页面中。
附加说明:,我添加这个是因为它可能会有所帮助。CF有另一个名为_cf_nodebug的URL/查询字符串变量。如果为false,则打开调试输出。
https://stackoverflow.com/questions/24187769
复制相似问题