Обновление зоны Tapestry на регулярной основе

Каков наилучший способ регулярно обновлять зону Tapestry, чтобы получать изменения набора данных с сервера?


person Ralf Edmund    schedule 22.06.2009    source источник
comment
Кстати, аналогичная функция запланирована — см. issues.apache.org/jira/browse/TAP5- 746   -  person Sergey    schedule 08.07.2009


Ответы (2)


Вы можете использовать Prototype PeriodicalExecuter и вызвать ZoneManager Tapestry для обновления зоны:

new PeriodicalExecuter(function(pe) {
    var zoneObject = Tapestry.findZoneManager(element);
    zoneObject.updateFromUrl(updateUrl);
}, 5);
person Henning    schedule 24.06.2009
comment
typeo PeriodicalExecutor -> PeriodicalExecutor - person pstanton; 17.11.2010

Во-первых, вам нужно указать 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);
person pstanton    schedule 16.11.2010
comment
это несколько изменилось со времен T5.2. MultiZoneUpdate остался в прошлом. хотя клиентская сторона в основном такая же. - person pstanton; 23.05.2012