Значение в xp: Подтверждение не обновляется после частичного обновления.Зачем? - PullRequest
0 голосов
/ 24 августа 2018

На странице x я вычисляю сообщение для элемента управления xp: verify:

var arr = viewScope.get("attachmentsAll");
if(arr.length>0){
    return "";
}else{
    return arr.length + " Are you sure want to upload the file?";
}

viewScope обновляется после выполнения события.Я проверяю это с помощью xp: text и замечаю, что это предположение верно.

<xp:text escape="true" id="computedField1"><xp:this.value><![CDATA[#{javascript:var arr = viewScope.get("attachmentsAll")

return arr.length + " number?"}]]></xp:this.value></xp:text>

Текст xp: verify и xp: находится на той же панели, которая частично обновляется после события.

Может кто-нибудь объяснить, почему обновляется значение переменной viewScopeв элементе управления xp: text, а не в элементе управления xp: verify?

1 Ответ

0 голосов
/ 24 августа 2018

Основная идея моего ответа на ваш предыдущий вопрос состояла в том, чтобы поставить input с вычисленным значением. Что если вы попытаетесь использовать <xp:this.script> вместо xp:confirm и получить сообщение о подтверждении от этого скрытого ввода таким же образом?

Обновление

Причина и альтернативное решение, не требующее внесения каких-либо изменений в существующую xpage

Оказалось, что внутренний экземпляр xp:confirm правильно оценивает новое сообщение. Новое значение даже отправляется в браузер с ответом на запрос ajax. Но одна из функций клиентского модуля XSP построена так, что он не будет обновлять функцию прослушивателя querySubmit, если она уже существует с таким именем. Итак, мы застряли со старой функцией подтверждения, которая содержит старое сообщение. Есть способ переопределить это поведение, не нарушая никаких других функций. Я попробовал это, и это работает для меня.

Создать новую библиотеку JavaScript (на стороне клиента). Добавьте код:

if (!XSP._pushListenerTuned) {
    XSP.__pushListener = XSP._pushListener;
    XSP._pushListener = function x__pl(listeners, formId, clientId, scriptId, listener) {
        if (scriptId && scriptId.endsWith("_confirm")) {
            for (var i = 0; i < listeners.length; i++) {
                if (scriptId == listeners[i].scriptId) {
                    listeners.splice(i, 1);
                }
            }
            listeners.push(new this._SubmitListener(formId, listener, clientId, scriptId));
        } else {
            XSP.__pushListener(listeners, formId, clientId, scriptId, listener);
        }
    }
    XSP._pushListenerTuned = true;
}

Присоедините вашу новую библиотеку как ресурс глобально через тему или как ресурс страницы на нужной странице Я думаю, размещение вышеуказанного кода как scriptBlock на необходимой странице также должно работать. Теперь любой компонент xp:confirm на любой странице (если вы использовали ресурс темы) или на определенной странице и везде после посещения этой страницы (если вы использовали ресурс страницы или scriptBlock), будет работать, как и ожидалось.

...