定期刷新Tapestry区域以从服务器提取数据集更改的最佳方法是什么?
答案 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"
现在您拥有url
和ZoneManager
,您可以初始化请求 - 响应循环:
zm.updateFromURL(url);
正如亨宁建议的那样,将其与原型中的PeriodicalExecuter相结合将实现您的目标:
new PeriodicalExecuter(function(pe)
{
var zm = Tapestry.findZoneManagerForZone("anyZoneId");
zm.updateFromUrl(url);
}, 5);