タペストリーゾーンを定期的に更新して、サーバーからデータセットの変更をプルするための最良の方法は何ですか?
2 に答える
Prototype のPeriodicalExecuterを使用して、Tapestry の ZoneManager を呼び出してゾーンを更新することができます。
new PeriodicalExecuter(function(pe) {
var zoneObject = Tapestry.findZoneManager(element);
zoneObject.updateFromUrl(updateUrl);
}, 5);
まず、イベント ハンドラーの 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 または別のゾーンの更新を返す場合、正しく処理されます。
マーシャリングにダミー ゾーンを使用し、1 つのゾーンのみを更新している場合でも、常に 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);