wicket:child标签可以嵌套在页面上的另一个组件下吗?

时间:2011-02-21 16:00:03

标签: html css wicket

在Wicket 1.4中,我试图允许子页面改变父页面中标记的CSS类,我一直这样做。这种情况的奇怪之处在于,我想要定位的标签包装子页面标记。这是我尝试的简化片段:

ParentPage.html

<div id="main" wicket:id="main">
  <wicket:child />
</div>

ParentPage.java

public abstract class ParentPage {

  private WebMarkupContainer main;

  protected ParentPage() {
    main = new WebMarkupContainer("main");
    add(main);
  }

  public void setClassAttr(String cssClass){
    main.add(SimpleAttributeModifier("class", cssClass);
  }
}

ChildPage.html

<wicket:extend>
  ...
</wicket:extend>

ChildPage.java

public class ChildPage extends Page {    
   ...

    public ChildPage() {
      super();
      ...     
      setClassAttr("specific-class-for-this-page");
    }
}

...因为看起来 child 中的HTML加载了,而不是java,所以会爆炸。 (如果我删除了div#main上的wicket:id和java代码,一切都很好。)

请注意, parent 上我想要从子操作的标记实际上是包裹wicket:child标记。在其他情况下,我做了类似的事情,我想要与之相关的标签往往是兄弟姐妹,或者与wicket:child标签相距甚远。

我真正想做的就是让孩子改变父母的class属性 - 还有另外一种方法吗?为什么子页面不能嵌套在另一个Wicket页面组件下?

6 个答案:

答案 0 :(得分:7)

我想指出,从Wicket 1.5开始,这已被删除。因此,如果您使用的是Wicket 1.5或更高版本,则可以使用TransparentWebMarkupContainer组件而不是WebMarkupContainer.isTansparentResolver()。我也遇到了和海报一样的问题。我有一个外部的包含div,包含一个wicket:child标签,我根据需要显示的内容调整其宽度(Twitter Bootstrap流体网格)。我的mainContentContainerTransparentWebMarkupContainer

<div class="row-fluid">
    <div class="span3" wicket:id="sidebarPanel"></div>
    <div class="span6" wicket:id="mainContentContainer">
        <wicket:child/>
    </div>
    <div class="span3" wicket:id="rightPanel"></div>
</div>

有时rightPanel完全隐藏,mainContentContainer更改为class="span9"以占用未使用的视口。

See here

感谢发帖。在我阅读这篇文章之前,我遇到了完全相同的问题。

答案 1 :(得分:3)

首先,它与实际设置属性无关,而是将<wicket:child>放在容器中。

现在想象一下,如果ChildPagePanel,那么ParentPage的代码会是什么样子?它会包含一行main.add( new ChildPanel() )。这就是main组件在呈现时知道它应该如何调用子面板的呈现方法。

但是继承会有所不同。您的main组件无法知道<wicket:child>应解决的问题。将main容器标记为透明告诉Wicket要求父组件(即您的页面组件)解析并呈现它。

答案 2 :(得分:1)

它运作良好。在wicket上的组件:id =“main”做上面的事情。

ain = new WebMarkupContainer("main") {
    private static final long serialVersionUID = 1L;

    @Override
    public boolean isTransparentResolver() {
        return true;
    }
};

并且不会发生异常。

答案 3 :(得分:1)

我认为您的子页面扩展了父页面。为什么不将类名传递给父的构造函数,如

public class ChildPage extends ParentPage {    
   public ChildPage() {
     super("my-class");
   }
}

答案 4 :(得分:0)

一位同事找到了修复程序 - 将组件放在检票口上:子标记为“transparentResolver”。任何能够清楚地表达出如何正常工作的人都能获得+1吗?

    main = new WebMarkupContainer("main") {
        private static final long serialVersionUID = 1L;
        @Override
        public boolean isTransparentResolver() {
            return true;
        }
    };
    add(main);

答案 5 :(得分:0)

我认为,你的检票口使用(或至少你发布的代码)很奇怪(我试过1.4.22)...

public abstract class ParentPage {

可能你忘了extends WebPage

public class ChildPage extends Page { 

这里你想扩展ParentPage我想。

一切都按预期工作,最终生成的HTML是

<div id="main" wicket:id="main" class="specific-class-for-this-page">
    <wicket:child>
        <wicket:extend>
            text
        </wicket:extend>
    </wicket:child>
</div>

我的建议是&#34;当你不需要&#34;时,不要将HTML id用于wicket元素。