全局Javascript变量变为null

全局Javascript变量变为null,javascript,xpages,Javascript,Xpages,我有一个在javascript中使用全局变量的xPages应用程序。全局变量是一个NotesDocument。当xPage加载时,它调用一些填充全局Javascript变量的Java代码 过了一会儿,我从全局变量中提取了一些信息,一切正常。稍后在代码中,我从一个Javascript库中运行了一个函数,该函数试图访问该全局变量,结果为null。我不知道为什么。没有其他任何东西可以更新该全局变量 有人能给我指个方向来解决这个问题吗 //This is the script library f

我有一个在javascript中使用全局变量的xPages应用程序。全局变量是一个NotesDocument。当xPage加载时,它调用一些填充全局Javascript变量的Java代码

过了一会儿,我从全局变量中提取了一些信息,一切正常。稍后在代码中,我从一个Javascript库中运行了一个函数,该函数试图访问该全局变量,结果为null。我不知道为什么。没有其他任何东西可以更新该全局变量

有人能给我指个方向来解决这个问题吗

    //This is the script library function that throws the null error:
    var revoPayments = 
    {
        //  Calculate if the occupant should see the Revo Pay My Bill Link in the occ navigator
        "renderPayMyBillRevo" : function() 
        {
            var result = false;
            try 
            {
                //  THIS IS WHERE THE GLOBAL VAR IS NULL
                if( parseInt( gUserOccupantProfile.getShowRevoLink() ) == -1 )
                    result = true;
            } catch (e) 
            {
                print(e.message);
            }
            print( "result: " + result );
            return result;
        }
    }
    //This is the calling javascript from the xPage which works fine pulling all the values etc.
    if( gUserOccupantProfile && gUserOccupantProfile !== "null" && gUserOccupantProfile !== "undefined" )
    {
        //  ALL THESE VALUES ARE SET BECAUSE IT'S A VALID OBJECT
        sessionScope.put( "OccupantUNID", gUserOccupantProfile.getDocUNID());
        sessionScope.put( "Tenant_ID", gUserOccupantProfile.gettenant_id() );
        sessionScope.put( "UnitRefNo", gUserOccupantProfile.getUnitRefNo() );
        sessionScope.put( "Resident", gUserOccupantProfile.getResident() );
        sessionScope.put( "FirstName", gUserOccupantProfile.getFirstName() );
        sessionScope.put( "LastName", gUserOccupantProfile.getLastName() );
        sessionScope.put( "CurrentUser", gUserOccupantProfile.getFirstName() + " " + gUserOccupantProfile.getLastName() );
        sessionScope.put( "PropertyAddress", gUserOccupantProfile.getPropertyAddress() );
        var tempStr = gUserOccupantProfile.getcurrent_balance();
        tempStr = tempStr.replace( "$", "" );
        tempStr = tempStr.replace( ",", "" );
        sessionScope.put( "Current_Balance", tempStr );
        sessionScope.put( "PropertyNo", gUserOccupantProfile.getPropertyNo() );
        sessionScope.put( "PropertyName", gUserOccupantProfile.getPropertyName() );
        sessionScope.put( "LastPaymentDate", gUserOccupantProfile.getLast_payment_date() );
        sessionScope.put( "LastPaymentAmount", gUserOccupantProfile.getPayment_amount() );

        gAPropertyProfile = eStarService.getPropertyProfile( sessionScope.get( "PropertyNo" ) );
        //  09.15.2014 - Steven Rieger  :  added code to disable pay my bill for separate properties
        //  Default is to always display the option.
        if( gAPropertyProfile.getDisablePayMyBill().toLowerCase() == "yes" )
            sessionScope.put( "renderPayMyBill", false );
        else
            sessionScope.put( "renderPayMyBill", true );

        sessionScope.put( "renderStatements", myEStatements.renderStatements() );
        print( "Before RenderRevo" );
//  THIS LINE FAILS BECAUSE IN THE SCRIPT LIBRARY CODE ( SEE ABOVE ) THE 
//  GLOBAL VAR IS NULL
        sessionScope.put( "renderPayMyBillRevo", revoPayments.renderPayMyBillRevo() );
        print( "After RenderRevo" );

    //  sessionScope.put( "dialogOopsTitle", "Debug!" );
    //  sessionScope.put( "dialogOopsMessage", "gotLogEntry: " + gotLogEntry );
    //  var dialogOops = getComponent( "dialogOops" );
    //  dialogOops.show();

    }

我很确定你不能这样做。不能让全局SSJS变量包含带有代码的方法函数。我相信,In可以包含具有“静态”值的函数。 建议你看看这个帖子:
专注于蒂姆·特里科尼的回答


我应该补充一点,最好的解决方案是将此代码移动到Java托管bean中。另一种SSJS解决方案可能是,不将所有这些值放在不同的作用域变量中。。。创建一个HashMap并使用它替换所有作用域变量。然后,可以将整个映射传递给脚本库中的SSJS函数,以检查映射并给出您正在寻找的答案。只是大声想一下…

我很确定你不能这样做。不能让全局SSJS变量包含带有代码的方法函数。我相信,In可以包含具有“静态”值的函数。 建议你看看这个帖子:
专注于蒂姆·特里科尼的回答


我应该补充一点,最好的解决方案是将此代码移动到Java托管bean中。另一种SSJS解决方案可能是,不将所有这些值放在不同的作用域变量中。。。创建一个HashMap并使用它替换所有作用域变量。然后,可以将整个映射传递给脚本库中的SSJS函数,以检查映射并给出您正在寻找的答案。在那里大声思考…

快速提示:您可能想要更改
gUserOccupantProfile!==“null”&&gUserOccupantProfile!==“未定义”
gUserOccupantProfile!==null&&gUserOccupantProfile!==undefined
。gUserOccupantProfile是在我的脚本库顶部定义的全局文件(代码中未显示)。我在线阅读了一些内容,如果它们是字符串值“null”或“undefined”以及if(gUserOccupantProfile),这两个文件会发现问题是否捕获空的或未定义的对象?仅当您与实际的
null
undefined
值进行比较时。与字符串进行比较没有帮助。如果您这样做,这将是正确的:
gUserOccupantProfile=“null”
,而如果您这样做:
gUserOccupantProfile=null
。快速提示:您可能想要更改
gUserOccupantProfile!==“null”&&gUserOccupantProfile!==“未定义”
gUserOccupantProfile!==null&&gUserOccupantProfile!==undefined
。gUserOccupantProfile是在我的脚本库顶部定义的全局文件(代码中未显示)。我在线阅读了一些内容,如果它们是字符串值“null”或“undefined”以及if(gUserOccupantProfile),这两个文件会发现问题是否捕获空的或未定义的对象?仅当您与实际的
null
undefined
值进行比较时。与字符串进行比较没有帮助。如果您这样做,则是正确的:
gUserOccupantProfile=“null”
,如果您这样做,则不是:
gUserOccupantProfile=null
。我将很快回顾这一点。我不得不说,我有第二个javascript函数,它非常相似,但作用于不同的全局SSJS对象,而且这个函数运行得很好,所以我感到困惑。不过,我确实有几个bean(两个全局变量也是如此),我试图将这种逻辑排除在bean之外,因为它只针对UI,而且bean在不同的应用程序中都有使用。您可以使用“pageBean”作为UI的控制器。我一直都是在Jesse Gallagher的一个小框架的帮助下这样做的,但是你可以在一个页面上手动创建一个框架。尽管我强烈推荐UI相关代码的控制器框架,但我将很快对此进行回顾。我不得不说,我有第二个javascript函数,它非常相似,但作用于不同的全局SSJS对象,而且这个函数运行得很好,所以我感到困惑。不过,我确实有几个bean(两个全局变量也是如此),我试图将这种逻辑排除在bean之外,因为它只针对UI,而且bean在不同的应用程序中都有使用。您可以使用“pageBean”作为UI的控制器。我一直都是在Jesse Gallagher的一个小框架的帮助下这样做的,但是你可以在一个页面上手动创建一个框架。尽管我强烈推荐用于UI相关代码的控制器框架。