Во-первых, вам нужно указать URL для вашего обработчика событий:
public String getModeChangedUrl()
{
// will call the onModeChanged method
return resources.createEventLink("ModeChanged").toAbsoluteURI();
}
Затем в блоке javascript в вашем tml присвойте URL-адрес переменной:
var modeChangedUrl = "${modeChangedUrl}";
Затем вам нужно получить дескриптор объекта JavaScript ZoneManager:
var zm = Tapestry.findZoneManagerForZone(zoneId);
Неважно, для какой зоны вы получаете ZoneManager, все это облегчает обратный вызов ajax. Если прослушиватель событий возвращает MultiZoneUpdate или обновление для другой зоны, он будет обработан правильно.
Я использую фиктивную зону для сортировки и всегда возвращаю MultiZoneUpdate, даже если я обновляю только одну зону. Поскольку чаще всего мне нужно обновлять несколько зон, мне проще быть последовательным в моем подходе. в любом случае, это немного не по теме для вашего вопроса.
если у вас есть дополнительные параметры для обработчика событий, вы можете добавить их к URL-адресу, разделенному символом «/», т. Е. http://www.host.com/app/page/event/param1/param2"
теперь, когда у вас есть url
и ZoneManager
, вы можете инициализировать цикл запрос-ответ:
zm.updateFromURL(url);
, как предложил Хеннинг, в сочетании с PeriodicalExecuter в прототипе вы получите то, что вы хотите:
new PeriodicalExecuter(function(pe)
{
var zm = Tapestry.findZoneManagerForZone("anyZoneId");
zm.updateFromUrl(url);
}, 5);