5

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

4

2 回答 2

4

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

new PeriodicalExecuter(function(pe) {
    var zoneObject = Tapestry.findZoneManager(element);
    zoneObject.updateFromUrl(updateUrl);
}, 5);
于 2009-06-24T09:08:27.527 回答
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”

现在你有了url和 a ZoneManager,你可以初始化请求-响应循环:

zm.updateFromURL(url);

正如 henning 所建议的,将其与原型中的PeriodicalExecuter结合起来将实现您想要的:

new PeriodicalExecuter(function(pe)
    {
        var zm = Tapestry.findZoneManagerForZone("anyZoneId");
        zm.updateFromUrl(url);
    }, 5);
于 2010-11-16T22:02:31.397 回答