GWTで本格的なアプリケーションとは対照的に、スタンドアロンのウィジェットを構築することは可能ですか?たとえば、スライダーウィジェットをjqueryプラグインとして作成し、それを使用して、既存のHTMLページ(JSFまたはJSFなどで生成されたHTML)に、サードパーティのその他のjqueryベースのウィジェットと一緒にインタラクティブ機能を追加できます。同じページ?これはGWTで可能ですか?
3 に答える
簡単な答えはイエスです。基本的に、htmlページには、指定されたIDを持つgwtウィジェットのコンテナーがあります。次に、gwtモジュールで次のように記述します。
RootPanel.get("ContainerId").add(MyWidget)
これは複雑になる可能性があることに注意してください。特に、gwtウィジェットとhtmlページの間の通信に関してはそうです。
GWTエクスポーターをご覧ください。
当初は、GWT以外の開発者がChronoscopeを使用できるようにするために構築されました:http ://code.google.com/p/gwt-chronoscope/
はい、できます。たとえば、HTMLウィジェットを見ると、一部の標準ウィジェットには、Rootpanelを使用せずにそれらをアタッチするための静的メソッドがすでに実装されています(「DOMプログラミング」を実行できます)。その目的のために静的メソッドラップがあります:
public static HTML wrap(Element element) {
// Assert that the element is attached.
assert Document.get().getBody().isOrHasChild(element);
HTML html = new HTML(element);
// Mark it attached and remember it for cleanup.
html.onAttach();
RootPanel.detachOnWindowClose(html);
return html;
}
したがって、コードでは、ウィジェットを既存のDOM要素にアタッチするために使用できます。
HTML html = HTML.wrap(Document.get().getBody().getFirstChildElement());
//or using selector engine (maybe wrapped Sizzle?):
HTML html = HTML.wrap(GSizzle.findOne("div.someClass:first"));
ウィジェットで同様の静的メソッドを作成できます。
class MyWidget extends Widget {
public static MyWidget wrap(Element element) {
MyWidget w = new MyWidget(element);
w.onAttach();
RootPanel.detachOnWindowClose(w);
return w;
}
//Widget has protected constructor Widget(Element)
//but it only creates widget but onAttach is called as Widget
//is added to Parent Widget-Panel
protected MyWidget(Element e) {
super(e);
}
//"plain" constructor for widget-panel-workflow
public MyWidget() {
super(Document.get().createDivElement());
}
}
ただし、重要なのは、domにアタッチする前にウィジェットで保護されたメソッドonAttachを呼び出すことです。ウィジェットをグローバルDOMイベントブロードキャスターにサブスクライブし、ウィジェットでRootPanel.detachOnWindowCloseを呼び出して、メモリリークを防ぎます。