2010-12-01 5 views
3

私がGWTで持っている共通の設計の1つは、AとBという2つの子を含むウィジェットを作成することです。GWTでは、uibinder xmlファイルで宣言されたウィジェットをロードしない方法がありますか?

私はこれらの2つのウィジェットAとBをメインウィジェットに関連付けられたuibinderファイルに宣言します。

私がしたいことは、if文に応じてAをロードするかどうかを指定することです。

理想的なアプローチは、ウィジェットAにprovide = trueを設定し、このウィジェットをロードしない場合にウィジェットAをnullに設定することです。しかし、GWTはエラーを投げます。

uibinderでウィジェットを宣言し、ロードしない方法はありますか?

おかげ

EDIT:議論の多くは後に、理想的なアプローチは、フィールドと「オプション= true」を「=真の提供」オプション=真、createAndBindUIがあれば例外をスローしてはならないと宣言することですフィールドはnullです。これはきれいなアプローチです。

この機能の必見はGWTに存在すると思われる場合は、この問題を主演してください: http://code.google.com/p/google-web-toolkit/issues/detail?id=5699

EDIT 2:LazyPanelを使っトーマスによって記載されているようにこれを処理するためのより良い方法のようです。

答えて

5

私はここで私を導いたGWTの問題につまずいたので、20ヶ月後にそれを取り上げます。

LazyPanelを使用し、(単にそのコンテンツの怠惰な初期化をtriggerring、それを公開するsetVisible(true)を呼び出すので、それはあなたがそれを必要とするまで、コンテンツが構築されていないということvisible="false"に設定します。それはSimplePanelであるかのように、あなたもLazyPanelのサブクラスを作成悩まずに、同じUiBinderサンプルメッセージテンプレートでその内容を宣言するよう

LazyPanelは完全にUiBinderサンプルメッセージに統合されています。 https://developers.google.com/web-toolkit/doc/2.4/DevGuideUiBinder#Lazy

+1

これは優れた方法です。私はこれが最善のアプローチだと思う。 20ヵ月後、私は私の投票を更新する;)(トーマス、あなたは私の答えの大部分を勝ち取っています、最近モンペリエに来たら、私に知らせてください、私は飲み物を支払うでしょう) –

+0

コンテンツ内に '@UiField(provided = true)'ウィジェットで試してみたことはありませんが、これはユニットテストされていません。 –

+0

@ThomasBroyer、なぜLazyPanelは1人の子供だけを許可しますか?私はそれが複数の子供を持たない理由は何も見ません。今私は 'SimplePanel'で子をラップする必要があり、レイアウトが面倒です。 – damluar

1

私はロジックを元に戻します。あなたは、ウィジェットが

widget.removeFromParent(); 

それを削除する必要はありません場合、私はUiBinderサンプルメッセージが自動的に定義し、それらを作成するので、それは、クリーンなアプローチだと思います。

+0

私はこの解決策を考えましたが、パフォーマンス上の問題があります。instanciate and remove widget:2つのDOM操作。もう1つの問題は、コンストラクタが空でない場合に、提供された= trueによってウィジェットを提供する必要がある場合、私はこれを提供したくないということです(私はどのインスタンスを提供するかわかりません) –

1

条件文がUiBinderサンプルメッセージのXMLで許可されていないので、私はあなたが、あなたのui.xmlプレースホルダ(すなわち、パネル)を定義するビュークラスでは、それらへの参照を持っており、特定のウィジェットがする必要があるかどうかが決めることをお勧めしたいです作成され、追加されたかどうか。

これは、ネストされたプレゼンターでMVPパターンを使用する場合の一般的なアプローチです。

EDIT:あなたの要求はGWTの開発者によって実装されるまで

あなたはのようにnullをチェックするためにFlowPanelを拡張し、add(Widget)メソッドを上書きすることができます:

public class ExtendedFlowPanel extends FlowPanel { 

    public ExtendedFlowPanel() { 
     super(); 
    } 

    @Override 
    public void add(Widget w) { 
     if (w != null) { 
      super.add(w); 
     } 
    } 
} 

あなたがprovided = trueを使用することができますこの方法をパネルにnullを渡します。

+0

このソリューションの問題シンプルなハンドラ定義を使用することはできませんし、uibinderでウィジェットを設計することはできません –

+0

シンプルなイベントハンドラのために、私は '古い'方法(これはまだうまくいきます:)を行う以外の方法はありません。スタイリングの場合:UiBinder XMLでコード内でやる(痛みがある、わかっている)か、ウィジェット(再利用可能な部分)をスタイルする。それとも可能ではないのですか? – z00bs

+0

... oooor(ちょっとしたアイデア):これらの2つのウィジェットAとBを含む新しい 'Composite'を作成し、いつ、どのように表示するかを決めることができます。 – z00bs

関連する問題