我有一个应用程序,其中我需要显示一些计数,如票证总数,打开/关闭的票数,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变量。
我错过了什么?
答案 0 :(得分:0)
OpenNTF Domino API具有DatabaseListeners
的概念,可以将其分配给Database
并挂钩save()
和createDocument()
方法。因此,基本上,当调用createDocument()
或save()
时,它还会在侦听器中运行自定义代码。
您需要基本上重现该功能。但是,因为applicationScope
只能从XPages代码中获得,所以它只能在XPage代码中使用。
对于后端代码,您可以更新&#34;配置文件&#34;文档和,在每个XPages页面上,检查该文档的上次修改时间是否晚于applicationScope
从中检索到的值的最后时间。这样你就可以包括后端创建/保存。但是,您需要更新创建/保存相关文档的所有位置。
答案 1 :(得分:0)
这个答案适用于那些不能或不想使用Java和OpenNTF Domino API的人:
在beforePageLoad
应用程序的欢迎页面或主页或每个XPage中包含的自定义控件中创建应用程序范围变量。
仅当应用程序范围变量为空或空时=在所有用户中只有一次时创建它。
在控件的onchange
事件中更改您的应用范围变量
以下代码是应用程序范围变量的工作示例,该变量包含名称及其出现次数的映射 (对应于您以前的问题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;浏览器标签之间。这甚至可以在不同的浏览器和用户之间工作。