Это на самом деле может быть намного проще, чем найденные вами фрагменты (вы можете отбросить все это) ... Рассмотрим следующий компонент:
public class PortfolioBean implements Serializable {
private static final long serialVersionUID = 1L;
private Map<String, Object> data = new HashMap<String, Object>();
public Map<String, Object> getData() {
return data;
}
public void autoSave(String unid, Boolean something) {
System.out.println("The unid is " + unid + " and something is " + something);
data.put("stamp", "autosave at " + new Date());
}
}
И следующий источник xsp:
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:div id="myForm" style="padding: 20px;">
<xp:eventHandler event="onautosave" id="eventAutoSave"
submit="false" action="#{javascript:portfolio.autoSave(sessionScope.unid, false)}" />
<p>Stamp</p>
<xp:inputText id="inputStamp" value="#{portfolio.data.stamp}" size="60" />
</xp:div>
<xp:scriptBlock value="
XSP.addOnLoad(function() {
window.setInterval(function() {
XSP.partialRefreshPost('#{id:inputStamp}', {
execId: '#{id:myForm}',
params: { '$$xspsubmitid' : '#{id:eventAutoSave}' },
onComplete: function() { console.log('complete at ' + new Date()); }
});
}, 5000);
});" />
</xp:view>
Я создал контейнер myForm
для создания «якоря» и сужения части страницы, которая оценивается, читается, отправляется или выполняется (наилучшая практика с учетом лучших показателей).myForm
, следовательно, идентификатор исполнения. Принципиально, что идентификатор выполнения принадлежит элементу, который содержит обработчик события, который вы хотите запустить .Если, например, я поместил событие onautosave
за пределами myForm
div, событие не будет запущено.Если вам наплевать (плохо!), Вы можете удалить свойство execId: '#{id:myForm}'
, переданное объекту в вызове метода XSP.partialRefreshPost
, и на этом этапе оно будет работать независимо от расположения компонентов xsp.
Кроме того, с помощью XSP.partialRefreshPost
вы можете решить, хотите ли вы частично обновить какой-либо элемент страницы или нет.Я поставил #{id:inputStamp}
, чтобы вы могли видеть, как поле ввода заполняется текстом, полученным в результате автоматического сохранения.Если вы знаете, что вам не нужно отображать какие-либо изменения DOM, которые могут возникнуть в результате оценки метода на стороне сервера, вы можете указать пустую строку (например, XSP.partialRefreshPost('',
), что будет означать norefresh
на стороне клиента.Но вы все равно можете что-то сделать по завершении операции, используя свойство onComplete
, как вы можете видеть из примера.
В свойстве params
идет дополнительный объект со свойством, которое определяет идентификатордействия, которое вы хотите запустить: { '$$xspsubmitid' : '#{id:eventAutoSave}' }
.
В заключение, каждые 5 секунд приведенный выше код будет:
- печатать на консоли Domino некоторый текст, чтобы показать вамчтобы событие было оценено на стороне сервера
- , заполните поле штампом и датой исполнения
- напечатайте на консоли браузера время выполнения метода
Никаких дополнительных зависимостей или фрагментов.Он работает так же, как из коробки.