Aggiornamento di una zona Tapestry con contesto dinamico
Domanda
Sto cercando di capire come aggiornare una zona del tapestry utilizzando un "contesto" dinamico, guidato dal lato client.Sono abbastanza nuovo nel mondo degli arazzi e per ora sono bloccato con la versione 5.0.
Il motivo principale per farlo è riutilizzare un altro componente Tapestry come figlio di una finestra di dialogo jquery, senza dover riscrivere il componente Tapestry.
Un problema è che la zona e tutti gli elementi che la controllano finiscono all'interno di una finestra di dialogo jquery.$jquery(...).dailog() tende a tagliare/incollare l'HTML di un elemento in un'altra posizione, il che potrebbe rompere qualcosa.Tuttavia, non sono riuscito a far funzionare le cose anche al di fuori di una finestra di dialogo jquery.
Ecco cosa ho provato, ma non sembra funzionare (forse ho sbagliato):
- Crea un eventlink associato alla zona e modifica l'href.Tapestry sembra invece utilizzare una variabile memorizzata da qualche parte sospiro.
- Crea un t:form associato alla zona.Quando provo ad aggiornarlo, posso dire che si sta verificando un evento lato server, ma la zona del tapestry non cambia o si aggiorna come dovrebbe.La zona si trova all'esterno e separata dal modulo.Non vedo nemmeno il tipico lampeggio giallo quando una zona viene aggiornata.
Soluzione
Ho trovato del codice di esempio che praticamente risolve il mio problema;non funzionava, ma mentre scrivevo la domanda qui su SO, ho visto cosa c'era che non andava.Poiché è probabile che anche qualcun altro abbia riscontrato questo problema, pubblico una risposta qui:
var zoneId = "itemZone"; // tml was <t:zone id="itemZone"...>
var zoneObject = Tapestry.findZoneManagerForZone(zoneId);
zoneObject.updateFromURL(url);
Per risolvere il problema con jquery .dialog() spostando html, devo anche copiare e preservare il gestore della zona in questo modo:(dove $J(...) è la mia abbreviazione di jquery, per evitare conflitti di prototipo)
prototypeStorageObj = $T("itemZone");
zoneManager = prototypeStorageObj.zoneManager;
// jquery stuff that kills the prototype data storage.
emailForm = $J("#myDialog");
emailForm.dialog({ autoOpen: false, modal:true });
emailForm.dialog('open');
// restore the zone manager so the zone works again:
$T("itemZone").zoneManager = zoneManager;