Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xpages:重新计算应用程序范围变量的最有效方法_Xpages_Xpages Extlib - Fatal编程技术网

Xpages:重新计算应用程序范围变量的最有效方法

Xpages:重新计算应用程序范围变量的最有效方法,xpages,xpages-extlib,Xpages,Xpages Extlib,我有一个应用程序,我需要在其中显示一些计数,如门票总数、打开/关闭的门票数量、类型X、Y、Z的门票数量 希望使用application.Scope计算和存储这些总计,但希望在某些内容发生更改(如新的或更改的文档)时更新它们 我怎么能这样做呢 以下是我发布的一个相关问题的链接:。看起来这正是我需要的。不过,有一些澄清 API具有数据库和文档的侦听器。我很困惑,我不想使用文档侦听器吗?我只想捕获对一种类型文档的更改 我不知道为什么我必须产生的功能,所以我一定是不理解的东西。添加两个侦听器,就像您在应

我有一个应用程序,我需要在其中显示一些计数,如门票总数、打开/关闭的门票数量、类型X、Y、Z的门票数量

希望使用application.Scope计算和存储这些总计,但希望在某些内容发生更改(如新的或更改的文档)时更新它们

我怎么能这样做呢

以下是我发布的一个相关问题的链接:。看起来这正是我需要的。不过,有一些澄清

API具有数据库和文档的侦听器。我很困惑,我不想使用文档侦听器吗?我只想捕获对一种类型文档的更改

我不知道为什么我必须产生的功能,所以我一定是不理解的东西。添加两个侦听器,就像您在应用程序中使用的那样

在//do something中,我调用了一个名为computeTotals的Java类(InitApp)方法,该方法加载applicationScope.whatever变量


我缺少什么?

OpenNTF Domino API有
数据库侦听器的概念,可以将其分配给
数据库
,并连接到
save()
createDocument()
方法。因此,基本上,当调用
createDocument()
save()
时,它也会在侦听器中运行自定义代码

您需要基本上重现该功能。但是,由于
applicationScope
只能从XPages代码中获得,因此它只能从XPages代码中工作


对于后端代码,您可以更新“配置文件”文档,并在每个XPages页面上检查该文档的上次修改时间是否晚于
applicationScope
从中检索值的上次时间。这样,您就可以包括后端创建/保存。但是,您需要更新创建/保存相关文档的所有地方。

此答案适用于不能或不想使用Java和OpenNTF Domino API的用户:

  • beforePageLoad
    event of application's welcome或home page中,或在每个XPage中包含的自定义控件中创建应用程序范围变量。
    仅当应用程序范围变量为null或空时才创建它=在所有用户中仅创建一次

  • 在控件的
    onchange
    事件上更改应用程序范围变量

  • 下面的代码是应用程序范围变量的工作示例,该变量包含名称映射及其出现次数
    (与你的前一个问题相对应):

    
    

    在多个浏览器选项卡中打开XPage。您可以看到数字是如何在浏览器选项卡之间“同步”的。这甚至在不同的浏览器和用户之间也能起作用。

    这太棒了,我问了两个澄清问题。如果您只想捕获一种类型的文档,那么创建后的文档将不相关。这会在
    Database.createDocument()
    之后立即触发,此时表单字段尚未设置;-)使用AFTER\u UPDATE\u DOCUMENT(在
    save()
    之后立即触发),源(
    event.getSource()
    ,可能需要转换为
    org.openntf.domino.DOCUMENT
    )可以访问文档对象,因此可以检查表单名称。因此,这里只需获取ApplicationScope并增加总数。
    事件。更新之后,文档是文档级侦听器。但是所有侦听器都添加到
    数据库
    对象中。然后,为数据库保存的任何文档都将触发AFTER_UPDATE_文档侦听器。您需要做的就是确保获取数据库的所有代码都通过一个函数,在该函数中还添加了侦听器。(如果您还没有这样做,一开始可能会觉得有很多重构,但是如果是当前的NSF,它总是
    getCurrentDatabase()
    ,所以查找和替换很快-已经完成了,完成了!;-)
    public List<EnumEvent> getEventTypes() {
        ArrayList<EnumEvent> eventList = new ArrayList<EnumEvent>();
        eventList.add(Events.AFTER_CREATE_DOCUMENT);
        eventList.add(Events.AFTER_UPDATE_DOCUMENT);
        return eventList;
    }
    
    public boolean eventHappened(IDominoEvent event) {
        try {
            if (event.getEvent().equals(Events.AFTER_CREATE_DOCUMENT)) {
                // Do something and return true if successful;
            }
            if (event.getEvent().equals(Events.AFTER_UPDATE_DOCUMENT)) {
                // Do something and return true if successful;
            }
            return false; // something went wrong, maybe an EnumEvent not implemented
        } catch (Exception e) {
            return false;
        }
    }