Xpages: наиболее эффективный способ пересчета переменных области приложения

У меня есть приложение, в котором мне нужно отобразить некоторые значения, такие как общее количество билетов, количество открытых / закрытых билетов, количество билетов типа X,Y,Z.

Хотелось бы использовать application.Scope для вычисления и сохранения этих итогов, но хотел бы обновить их, когда что-то меняется (например, новый или измененный документ).

Как я мог сделать это?

Вот ссылка на связанный вопрос, который я разместил: Xpages: получить количество значений в поле зрения с несколькими значениями. Похоже, это именно то, что мне нужно. Некоторое уточнение, однако.

У API есть слушатели базы данных и документа. Я в замешательстве, не хочу ли я использовать Document Listener? Я хочу записывать изменения только в один тип документа.

Я не уверен, почему я должен производить функциональность, поэтому я не должен что-то понимать. Добавьте двух слушателей, как у вас в своем посте.

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.whever.

Что мне не хватает?

2 ответа

Этот ответ для тех, кто не может или не хочет использовать Java и OpenNTF Domino API:

  1. Создайте переменную области своего приложения в beforePageLoad событие приветствия или домашней страницы приложения или в пользовательском элементе управления, который включен в каждый XPage.
    Создайте переменную области приложения, только если она пуста или пуста = только один раз для всех пользователей.

  2. Измените переменную области приложения на элементах управления onchange событие

Следующий код является рабочим примером для переменной области приложения, которая содержит карту имен с их количеством вхождений
(в соответствии с вашим предыдущим вопросом Xpages: получить количество значений в поле зрения с несколькими значениями):

<?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 в нескольких вкладках браузера. Вы можете видеть, как числа синхронизируются между вкладками браузера. Это работает даже между различными браузерами и пользователями.

OpenNTF Domino API имеет концепцию DatabaseListeners который может быть назначен на Database и подключиться к save() а также createDocument() методы. Так что, в основном, когда createDocument() или же save() вызывается, он также запускает пользовательский код в слушателе.

Вам нужно в основном воспроизвести эту функциональность. Тем не менее, потому что applicationScope доступно только из кода XPages, оно будет работать только из кода XPages.

Что касается внутреннего кода, вы можете обновить "профильный" документ и на каждой из ваших страниц XPages проверить, не является ли время последнего изменения этого документа более поздним, чем в последний раз. applicationScope извлеченные из него значения. Таким образом, вы можете включить бэкэнд создает / сохраняет. Однако вам нужно будет обновлять везде, где создаются / сохраняются соответствующие документы.

Другие вопросы по тегам