Wie kann ich eine Tapestry-Zone am besten regelmäßig aktualisieren, um Änderungen an einem Datensatz von einem Server zu beziehen?
Antworten
Zu viele Anzeigen?Sie können die Prototype-Funktion ZeitschriftExecuter und lassen Sie diese den ZoneManager von Tapestry aufrufen, um die Zone zu aktualisieren:
new PeriodicalExecuter(function(pe) {
var zoneObject = Tapestry.findZoneManager(element);
zoneObject.updateFromUrl(updateUrl);
}, 5);
Zunächst müssen Sie die URL für Ihren Event-Handler offenlegen:
public String getModeChangedUrl()
{
// will call the onModeChanged method
return resources.createEventLink("ModeChanged").toAbsoluteURI();
}
Weisen Sie dann in einem Javascript-Block in Ihrer tml die Url einer Variablen zu:
var modeChangedUrl = "${modeChangedUrl}";
Dann müssen Sie ein Handle auf ein ZoneManager-Javascript-Objekt erhalten:
var zm = Tapestry.findZoneManagerForZone(zoneId);
Es ist nicht wichtig, welche Zone Sie den ZoneManager für, alles, was dies tut, ist der Ajax-Callback zu erleichtern. Wenn der Ereignis-Listener ein MultiZoneUpdate oder ein Update für eine andere Zone zurückgibt, wird es korrekt behandelt.
Ich verwende eine Dummy-Zone für das Marshalling und gebe immer ein MultiZoneUpdate zurück, auch wenn ich nur eine Zone aktualisiere. Da ich meistens mehrere Zonen aktualisieren muss, finde ich es einfacher, in meinem Ansatz konsistent zu sein. Das ist allerdings ein wenig off topic für Ihre Frage.
Wenn Sie zusätzliche Parameter für den Event-Handler haben, können Sie diese an die Url anhängen, getrennt durch '/', z.B. "http://www.host.com/app/page/event/param1/param2".
jetzt, da Sie die url
und eine ZoneManager
können Sie die Anfrage-Antwort-Schleife initialisieren:
zm.updateFromURL(url);
wie Henning vorschlug, in Kombination mit dem ZeitschriftExecuter im Prototyp erreichen, was Sie wollen:
new PeriodicalExecuter(function(pe)
{
var zm = Tapestry.findZoneManagerForZone("anyZoneId");
zm.updateFromUrl(url);
}, 5);