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

时间:2016-01-27 15:59:12

标签: xpages xpages-extlib

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

想要使用application.Scope来计算和存储这些总数,但是想要在发生变化时更新它们(比如新的或更改过的doc)。

我怎么能这样做?

以下是我发布的相关问题的链接:Xpages: get count of values in multi-value field in view。看起来这正是我需要的。然而,有些澄清。

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

我不确定为什么要制作这些功能,所以我不能理解某些东西。在post中添加两个听众。

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;
    }
}

在//做一些事我调用一个方法我的Java类(InitApp)调用了一些computeTotals,这个方法加载了applicationScope.whatever变量。

我错过了什么?

2 个答案:

答案 0 :(得分:0)

OpenNTF Domino API具有DatabaseListeners的概念,可以将其分配给Database并挂钩save()createDocument()方法。因此,基本上,当调用createDocument()save()时,它还会在侦听器中运行自定义代码。

您需要基本上重现该功能。但是,因为applicationScope只能从XPages代码中获得,所以它只能在XPage代码中使用。

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

答案 1 :(得分:0)

这个答案适用于那些不能或不想使用Java和OpenNTF Domino API的人:

  1. beforePageLoad应用程序的欢迎页面或主页或每个XPage中包含的自定义控件中创建应用程序范围变量。
    仅当应用程序范围变量为空或空时=在所有用户中只有一次时创建它。

  2. 在控件的onchange事件中更改您的应用范围变量

  3. 以下代码是应用程序范围变量的工作示例,该变量包含名称及其出现次数的映射 (对应于您以前的问题Xpages: get count of values in multi-value field in view):

    <?xml version="1.0" encoding="UTF-8"?>
    <xp:view
        xmlns:xp="http://www.ibm.com/xsp/core">
        <xp:this.beforePageLoad><![CDATA[#{javascript:
            if (!applicationScope.numbers) {
                var numbers = {};
                // populate numbers object
                numbers["Albert"] = 56;
                numbers["Ben"] = 22;
                numbers["Chris"] = 79;
                applicationScope.numbers = numbers;
            }
            viewScope.namesPrevious = [];
        }]]></xp:this.beforePageLoad>
        <xp:checkBoxGroup
            id="checkBoxGroup1"
            value="#{viewScope.names}">
            <xp:selectItem itemLabel="Albert"></xp:selectItem>
            <xp:selectItem itemLabel="Ben"></xp:selectItem>
            <xp:selectItem itemLabel="Chris"></xp:selectItem>
            <xp:eventHandler
                event="onchange"
                submit="true"
                refreshMode="partial"
                refreshId="inputTextarea1">
                <xp:this.action><![CDATA[#{javascript:
                    for(var name in viewScope.names) {
                        if (viewScope.namesPrevious.indexOf(name) < 0) {
                            applicationScope.numbers[name]++;
                        }
                    }
                    for(var name in viewScope.namesPrevious) {
                        if (viewScope.names.indexOf(name) < 0) {
                            applicationScope.numbers[name]--;
                        }
                    }
                    viewScope.namesPrevious = viewScope.names;
                }]]></xp:this.action>
            </xp:eventHandler>
        </xp:checkBoxGroup>
        <br />
        <xp:inputTextarea id="inputTextarea1">
            <xp:this.value><![CDATA[#{javascript:
                var list = "";
                for(var key in applicationScope.numbers){
                    list += key + " = " + applicationScope.numbers[key] + "\n";
                }}]]></xp:this.value>
        </xp:inputTextarea>
        <xp:messages id="messages1" />
    </xp:view>
    

    在多个浏览器标签中打开XPage。你可以看到数字是如何同步的#34;浏览器标签之间。这甚至可以在不同的浏览器和用户之间工作。