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.
È stato utile?

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top