Обновление Гобеленовой зоны на регулярной основе - PullRequest
5 голосов
/ 22 июня 2009

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

Ответы [ 2 ]

4 голосов
/ 24 июня 2009

Вы можете использовать Prototype's PeriodicalExecuter , и иметь этот вызов TapMestry's ZoneManager для обновления зоны:

new PeriodicalExecuter(function(pe) {
    var zoneObject = Tapestry.findZoneManager(element);
    zoneObject.updateFromUrl(updateUrl);
}, 5);
3 голосов
/ 17 ноября 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);
...