定期刷新Tapestry区域

时间:2009-06-22 08:59:10

标签: ajax tapestry

定期刷新Tapestry区域以从服务器提取数据集更改的最佳方法是什么?

2 个答案:

答案 0 :(得分:4)

您可以使用Prototype的PeriodicalExecuter,并调用Tapestry的ZoneManager来更新区域:

new PeriodicalExecuter(function(pe) {
    var zoneObject = Tapestry.findZoneManager(element);
    zoneObject.updateFromUrl(updateUrl);
}, 5);

答案 1 :(得分:3)

首先,您需要公开事件处理程序的URL:

public String getModeChangedUrl()
{
    // will call the onModeChanged method
    return resources.createEventLink("ModeChanged").toAbsoluteURI();
}

然后,在tml的javascript块中将url分配给变量:

var modeChangedUrl = "${modeChangedUrl}";

然后你需要获得ZoneManager javascript对象的句柄:

var zm = Tapestry.findZoneManagerForZone(zoneId);

您获得ZoneManager的区域并不重要,所有这一切都有助于ajax回调。如果事件侦听器返回MultiZoneUpdate或其他区域的更新,则会正确处理。

我使用虚拟区域进行编组,即使我只更新一个区域,也总是返回一个MultiZoneUpdate。由于我经常需要更新多个区域,因此我发现在我的方法中更容易保持一致。无论如何,这对你的问题来说有点偏僻。

如果您有事件处理程序的其他参数,您可以将它们附加到由'/'分隔的URL,即“http://www.host.com/app/page/event/param1/param2"

现在您拥有urlZoneManager,您可以初始化请求 - 响应循环:

zm.updateFromURL(url);
正如亨宁建议的那样,将其与原型中的PeriodicalExecuter相结合将实现您的目标:

new PeriodicalExecuter(function(pe)
    {
        var zm = Tapestry.findZoneManagerForZone("anyZoneId");
        zm.updateFromUrl(url);
    }, 5);