L'insertion de GWT widget dans un élément div
Je suis en utilisant une GWT bibliothèque (gwt-openlayers) qui me permet de créer une carte popup contenant du code HTML arbitraire, similaire à Google Maps. J'ai besoin de ce code HTML pour contenir une GWT Bouton de widget.
Je suis la création de certains éléments HTML à la volée comme ceci:
Element outerDiv = DOM.createDiv();
outerDiv.getStyle().setOverflow(Overflow.HIDDEN);
outerDiv.getStyle().setWidth(100, Unit.PCT);
outerDiv.appendChild(new HTML(mapPOI.getHtmlDetails()).getElement());
Button popupButton = new Button("View Property");
popupButton.getElement().getStyle().setFloat(com.google.gwt.dom.client.Style.Float.RIGHT);
outerDiv.appendChild(popupButton.getElement());
Puis je me fais de la source HTML pour ces éléments en appelant
String src = outerDiv.toString();
et en insérant ce code html dans mon marqueur de carte. Maintenant, mon marqueur de carte affiche le contenu ok, y compris le bouton. Toutefois, le bouton ne sera pas répondre à tous les événements! De ce que j'ai pu rassembler, c'est parce que les boutons onAttach() la méthode n'est jamais appelé.
Est-il une meilleure façon de le faire?
Merci,
Jon
~~~~EDIT~~~~
Je vais maintenant essayer une nouvelle façon de faire ce qui semble être la méthode acceptée à la recherche à d'autres postes similaires.
D'abord, je suis la création de mon div:
String divId = "popup-" + ref;
String innerHTML = "<div id=\"" +divId + "\"></div>";
Ensuite, je suis en ajoutant ce ma carte pop-up et de l'affichage (ce qui ajoute à la DOM). Après le pop-up s'affiche, je suis de l'Élément comme suit et tente d'enrouler une HTMLPanel autour d'elle:
Element element = Document.get().getElementById(divId);
HTMLPanel popupHTML = HTMLPanel.wrap(element);
Mon élément div est extrait avec succès. Cependant, HTMLPanel.wrap(element);
n'est pas complète. La raison pour cela est que wrap(..)
appels RootPanel.detachOnWindowClose(Widget widget)
, qui comprend les assertions suivantes:
assert !widgetsToDetach.contains(widget) : "detachOnUnload() called twice "
+ "for the same widget";
assert !isElementChildOfWidget(widget.getElement()) : "A widget that has "
+ "an existing parent widget may not be added to the detach list";
J'ai mis des points d'arrêt dans et il semble que la 2ème affirmation est défaillante!
N'quelqu'un a une idée de quoi cela peut-il être le cas? Devrait, à défaut de cette affirmation vraiment entraîner une défaillance complète de la méthode (pas de retour)?
OriginalL'auteur DeadPassive | 2012-07-13
Vous devez vous connecter pour publier un commentaire.
Votre première démarche est la bonne, il suffit de vous inscrire événement onClick pour votre bouton comme ceci:
J'ai vérifié cela, il fonctionne à 100%!
OriginalL'auteur codebusta
Vous pouvez essayer quelque chose comme
Voir RootPanel.get()
Malheureusement, RootPanels sont
AbsolutePanels
qui ne sont pas si agréable pour la mise en page, mais pourrait fonctionner si vous avez juste un simple bouton ajouter. Vous pouvez également essayer deRootLayoutPanel
qui vous donnera un LayoutPanel (également pas très agréable quand vous voulez juste les choses à l'écoulement). Vous pourriez finir par la création d'un conteneur widget qui fait la mise en page, et l'ajout de que à la RootPanel.RootPanel.get("divId");
mais il ne lance pas d'exception! Très bizarre.OriginalL'auteur Riley Lark
SimplePanel est un DIV. Peut-être, qui peut être utilisé à la place?
OriginalL'auteur liftarn
Vous avez ajouté l'élément, mais vous devez garder la hiérarchie réelle des Widgets GWT trop.
Je ne vois pas un moyen propre pour ce faire, mais vous pouvez utiliser quelque chose comme jQuery pour attraper le bouton et ID et cliquez sur ajouter un gestionnaire de retour pour remettre l'original cliquez sur gestionnaire.
Appel de cette registerEvents() dans votre onAttach ou d'un constructeur.
Son problème, c'est qu'il est des éléments de construction, puis de saisir le code HTML pour l'ensemble de ces éléments et en l'envoyant à une 3ème partie widget (certains marqueur de carte). Le problème initial déjà semble dangereux, c'est pourquoi j'ai dit "je ne vois pas un moyen propre", cependant c'EST une solution qu'il pourrait utiliser, il suffit d'appeler et d'équivalents méthode de nettoyage de lui-même.
OriginalL'auteur checketts
Une fois, j'ai eu un problème similaire. Vous pouvez utiliser le gwt-openlayer de
MapWidget
comme suit:Puis l'ajouter à n'importe quel panneau verticale ou à l'horizontale.
Vous pouvez enfin ajouter le créé
Panel
(contenant leMapWidget
et la widget gwt) auPopupPanel
. Aussi, vous devriez maintenant être en mesure d'ajouter des gestionnaires de l'gwt bouton.OriginalL'auteur pratZ