范围在会话范围的 CFC 文件夹之外无法工作

问题描述 投票:0回答:2

我最近在工作中安装了 ColdFusion 2018,但由于示波器无法正常工作而感到沮丧。像往常一样,我将所有 .cfc 放入 /CFC 文件夹中,如果该文件夹中没有空白

application.cfm
文件,它们都不会执行。我尝试过扩展应用程序,包括应用程序、代理扩展应用程序,将 CFC 移动到根文件夹只会导致 JSON 出现语法错误。我读了过去两周能找到的每一篇文章,但我仍然无法理解为什么作用域不起作用。我似乎可以在 /CFC 文件夹内设置会话变量,但它们在文件夹外不可用?我已经有几年没有使用 CF 了,但我认为自己很熟悉,但我一生都无法让它发挥作用。我可能因为树木而错过了森林,但如果有人愿意提供帮助,我将不胜感激。

实例化对象;

application.SessionMgr = CreateObject(this.obj,'CFC.SessionMgr').init('session');

代理调用;

cfajaxproxy cfc="CFC/SessionMgr"       jsclassname="SessionMgr";

返回正确;

var s = new SessionMgr();
       var setReport = s.setValue('ReportID', document.getElementById('cboReportKey').value);
       alert(setReport);

但是,即使手动设置

session.ReportID = 7
也不会保留在文件夹之外。

这里是

SessionMgr.init

这是

init

<cffunction name="init" access="public" returntype="SessionMgr" output="no" hint="I instantiate and return this object.">
        <cfargument name="scope" type="string" required="yes">
        <cfargument name="requestvar" type="string" default="SessionInfo">
            <cfset var scopes = "application,Client,Session">
            <cfif Not ListFindNoCase(scopes, arguments.scope)>
                <cfthrow message="The scope argument for SessionMgr must be a valid scope (#scopes#)." type="MethodErr">
            </cfif>
            <cfset variables.scope = arguments.scope>
            <cfset variables.requestvar = arguments.requestvar>
            <cfset updateRequestVar()>
        <cfreturn this>
    </cffunction>

setValue
fn

<cffunction name="setValue" access="remote"  hint="I set the value of the given user-specific variable." returntype="string">
        <cfargument name="variablename" type="string" required="yes">
        <cfargument name="value" type="any" required="yes">
            <cfset var val = arguments.value />
            <cfset SetVariable("#arguments.variablename#", val) />
            <cfset r =  Evaluate(arguments.variablename) />
        <cfreturn r />
    </cffunction>
coldfusion cfc application.cfc coldfusion-2018
2个回答
0
投票

好吧,在尝试了一切之后,这就是解决方案。通过代理扩展不适用于这种情况,尝试过。最终起作用的是在 /CFC 文件夹中创建一个 application.cfc 并从 /root application.cfc 中删除所有功能组件,并简单地确保 /CFC 文件夹中的精简版本中的应用程序名称与 /root cfc 相同姓名。这显然是伪扩展了 /root application.cfc 中的所有功能,并使 /CFC 文件夹中的框架可以使用所有内容。感谢这里的每个人帮助我思考并解决这个问题。


0
投票

您绝对不需要将

remote
值添加到
access
标签的
function
属性。

我真的不建议使用字符串来表示

session
范围作为
setVariable()
的第一个参数。

相反,创建一个只处理持久作用域的方法,那么你甚至不需要返回任何东西。

所以这就是我将如何进行:

<cffunction name="setPersistentValue" access="remote"  hint="I set the value of the given user-specific variable." returntype="void">
    <cfargument name="scope" type="string" required="yes">
    <cfargument name="variablename" type="string" required="yes">
    <cfargument name="value" type="any" required="yes">
                    
    <cfswitch expression=" #arguments.scope#">
        <cfcase value="session" /> 
            <cfset session[arguments.variablename] = arguments.value />
        </cfcase>
        <cfcase value="application" /> 
            <cfset application[arguments.variablename] = arguments.value />
        </cfcase>
        <cfcase value="server" /> 
            <cfset server[arguments.variablename] = arguments.value />
        </cfcase>
        <cfcase value="cookie" /> 
            <cfset cookie[arguments.variablename] = arguments.value />
        </cfcase>
        <cfdefaultcase></cfdefaultcase>
    </cfswitch>
</cffunction>

如果您确实想返回某些内容,只需将值添加到

local
变量并返回即可。

© www.soinside.com 2019 - 2024. All rights reserved.