2009-11-30 5 views
1

J'ai un bloc de HTML que j'aimerais utiliser comme base d'un widget GWT, mais je ne suis pas sûr de la meilleure façon de le faire. À titre d'exemple, mon bloc HTML ressemble à ceci:Widget GWT à partir du HTML

<div class="my-widget"> 
    <div class="header"> 
     <span class="title">Title Text</span> 
    </div> 
    <div class="body"> 
     <span class="content">Content Text</span> 
    </div> 
</div> 

Maintenant, je peux bien sûr coller cela comme une chaîne statique dans un widget HTML, mais dans ce cas j'ai besoin la possibilité de définir le texte de la éléments "title" et "content" à la volée. Cela tue (ou rend au moins beaucoup plus difficile) l'option de texte statique.

La première chose qui vient à l'esprit dans ce cas est de construire les éléments GWT manuellement et contenir des références à ceux que je dois modifier, comme suit:

DivElement container = document.createDivElement(); 
setStyleName(container, "my-widget"); 
setElement(container); 

DivElement header = document.createDivElement(); 
setStyleName(header, "header"); 
container.appendChild(header); 

// Hold onto this element for later manipulation 
DivElement title = document.createDivElement(); 
setStyleName(title, "title"); 
header.appendChild(title); 

Mais cette obtenir rapidement ingérable pour Ce que je voudrais est la possibilité d'envoyer le HTML en tant que texte statique, puis faire une sorte de sélecteur, comme jQuery, pour interroger les éléments que je veux manipuler. Je suis au courant de GWT-Query mais je n'ai pas pu le faire fonctionner sans erreur, et il me semble être un peu trop tôt dans sa vie pour être à l'aise de l'intégrer dans un produit professionnel pour le moment.

Je suis également au courant de UiBinder de Google, qui ressemble exactement à ce que je veux. Le problème est, pour autant que je sache, que la fonctionnalité n'est disponible que dans GWT 2.0, qui est toujours dans un état candidat à la publication et donc inutilisable pour moi.

Donc, étant donné tout cela (désolé pour la longue question!) Avez-vous des suggestions sur la meilleure façon de réaliser quelque chose comme ça?

Répondre

5

GWT 2.0 sera disponible avant la fin de l'année. Donc, à moins que vous n'ayez besoin de livrer dans quelques jours, je commencerais à travailler avec le RC2 et j'essaierais la nouvelle approche UIBinder.

+0

Eh bien, je dois livrer dans environ deux semaines. :) Je me suis rapproché de mes goûts, mais après avoir joué avec GWT 2.0 la nuit dernière à la maison pendant quelques heures, je suis arrivé à la conclusion que toute solution que je trouverai sera loin de la merveilleuse librairie UiBinder que Google a créé. Je vais juste mordre la balle sur celui-ci et commencer à développer en utilisant cela, en espérant et en priant que Google ne me tire pas dessus quand je le fais. – Toji

+0

Bon choix, je ne pense pas que vous ayez à avoir trop peur du choix. UiBinder est un ajout important et a été conçu pour Google Wave, il a donc été largement utilisé. De plus, les RC sont généralement complets, ils veulent simplement s'assurer qu'il n'y a plus de bogues gênants. –

3

Comment utiliser HTML.wrap(). Par exemple, si vous avez ajouté un id de « my-widget » à votre plus externe div que vous pourriez faire quelque chose comme:

HTML myWidget = HTML.wrap(RootPanel.get("my-widget").getElement()); 
+0

Je ne suis pas entièrement sûr de comprendre ce que vous voulez dire. Je suppose que vous voulez masquer une instance des balises que je veux dans la page HTML quelque part et les dupliquer chaque fois que j'ai besoin d'une nouvelle instance de widget? Cela ne résout pas vraiment le problème de remplacement de données, et je vais bien avoir le balisage stocké comme une chaîne statique dans le code Java, donc je ne pense pas que cela m'achète vraiment beaucoup. Merci pour la suggestion, cependant. – Toji

0

Comme vous le savez probablement, GWT ne fournit pas construit dans le widget cartes directement à un élément de portée. Si vous pouvez utiliser un div pour le titre et le contenu, alors ce bit de code devrait (pas de GWT sur cette machine, en allant un peu en mémoire) générer la structure DOM que vous avez. À partir de là, vous pouvez fournir des accesseurs aux étiquettes de contenu et de titre et les mettre à jour si nécessaire.

title.setText(newTitle); 
content.setText(newContent); 
+0

Oui, cela me donne en effet une bonne approximation du code HTML que j'ai posté. Cependant, le code HTML que je cherche à reproduire est beaucoup plus complexe que cela et, comme je l'ai dit dans ma question, gérer très rapidement de nombreux tags par le biais du code devient irréalisable. (Surtout si la mise en page a besoin d'une mise à jour à l'avenir). J'ai peur que cette solution ne soit simplement pas faisable pour mes besoins. – Toji

1

Vous pouvez utiliser le widget InlineHTML pour produire une plage et contrôler son contenu.

0

La même chose que ci-dessus, mais obtenir un panneau GWT (pouvoir ajouter des enfants). Cela est également utile lorsque vous devez enrober un objet GUI tiers de la boîte à outils en tant que widget GWT:

Panneau gwtPanel = HTMLPanel.wrap (anElement);

0

Les suites de code suivant pour moi:

HorizontalPanel divContainer = new HorizontalPanel(); 
Element div = DOM.createDiv(); 
div.appendChild(...); // whatever element it could fit inside 
divContainer.getElement().appendChild(div); 

Modifier

L'idée sous-jacente est manipulait les DOM avec les autres widgets que vous avez déjà programmés. PS: J'utilise GWT 2.4

Questions connexes