8

こんにちは、ウィケット テンプレートの特定の部分 (たとえば div) を特定の条件下でのみ表示したい (たとえば、データを入力する場合のみ)。問題は:

データを取得した場合にのみパネルを追加 (div を埋める) すると、データなしでページを呼び出すたびに例外がスローされます (参照された wicket-id がコンポーネント ツリーに追加されないため)。

私の頭に浮かんだ唯一の解決策は、データがない場合に空のパネルを追加することでした. Javaコードに不要なコードがあり、レンダリングされたhtmlに多くの空のdivがあるため、これは理想的なソリューションではありません。

ある条件下でのみ wicket-template のいくつかの部分を含めるためのより良い解決策はありますか?

4

5 に答える 5

5

これは古い質問ですが、もう1つの解決策になる可能性があります: wicket:enclosure (およびthis )

更新:今、私は自分でこの機能が必要でした(ジェットウィック用)。私は WebMarkupContainer を LoggedIn 状態用に 1 つと LoggedOut 状態用に 1 つ使用し、適切な可視性を設定しています。

if (loggedIn()) {            
   WebMarkupContainer loggedInContainer = new WebMarkupContainer("loggedIn");
   //## do something with the user
   User user = getUserSomeWhere();
   loggedInContainer.add(new UserSearchLink("userSearchLink"));
   add(loggedInContainer);
   add(WebMarkupContainer("loggedOut").setVisible(false));
} else {
   add(new WebMarkupContainer("loggedIn").setVisible(false));
   WebMarkupContainer loggedOutContainer = WebMarkupContainer("loggedOut");
   loggedOutContainer.add(new LoginLink() {...});
   add(loggedOutContainer);
}

私にとってこれの利点は、 //## マークされた行で NullpointerExc を防ぐことであり、この場合、ウィケットの囲み機能がより見苦しく見えると思います。

于 2010-08-01T17:03:24.523 に答える
3

そうです、isVisible をオーバーライドしたいのです。これにより、 isVisible=false html マークアップが最終的な html ページにレンダリングされなくなります。また、ドキュメント ( EmptyPanelに記載) によると、 WebMarkupContainerをラッピング コンポーネントとして使用できます。

    this.add(new SimpleResourceModelLabel(NO_DATA_LABEL){
        private static final long serialVersionUID = 1L;

        @Override
        public boolean isVisible() { return myList.isEmpty(); } 
    });

    final WebMarkupContainer table = new WebMarkupContainer(MY_DATA_TABLE){
        private static final long serialVersionUID = 1L;

        @Override
        public boolean isVisible() { return !myList.isEmpty(); } 
    };
于 2010-05-04T16:42:26.260 に答える
3

@miaubizが言ったように、可視性が他の状態(たとえば、フィールドが埋められている)に条件付きである場合は、setVisible(false)を呼び出すか、isVisible()メソッドをオーバーライドできます。

于 2009-09-22T02:13:14.050 に答える
1

これがEmptyPanelがある理由だと思います。あなたのコードについてもっと知らなくても、あなたがしていると思うことは、AbstractRepeaterFragmentの子を組み合わせて行うことだとしか言えません。あなたがやりたいことについてもっと詳しく教えて、コードも提供してくれるなら、喜んでお手伝いします。

于 2009-08-08T08:56:58.260 に答える
0

setVisible(false); を呼び出すことができます。非表示にするコンポーネントで。

于 2009-09-09T08:22:12.520 に答える