Каков наилучший способ регулярно обновлять зону Tapestry, чтобы получать изменения набора данных с сервера?
Обновление зоны Tapestry на регулярной основе
Ответы (2)
Вы можете использовать Prototype PeriodicalExecuter и вызвать ZoneManager Tapestry для обновления зоны:
new PeriodicalExecuter(function(pe) {
var zoneObject = Tapestry.findZoneManager(element);
zoneObject.updateFromUrl(updateUrl);
}, 5);
Во-первых, вам нужно указать 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);