现在和Wicket合作了几个星期,我很难在标记面板上维护样式的最佳方法。例如,假装我有以下面板(忽略Java方面,我认为不相关):
<wicket:panel>
<div class="brick"></div>
</wicket:panel>
现在我正在构建一个新组件,如下所示:
<wicket:panel>
<div class="wall">
<div wicket:id="aBrick" class="good"></div>
<div wicket:id="bBrick" class="bad"></div>
</div>
</wicket:panel>
所以,我们的墙有一块好砖和坏砖。为了给出一些上下文,假设类的优缺点为布局做了些事情,比如为好类添加float:left
,为坏类添加float:right
。理想情况下,最终标记显示如下:
<div class="wall">
<div class="brick good"></div>
<div class="brick bad"></div>
</div>
但是,使用当前代码,我似乎只限于以下两个选项之一:
A)输出所有标记,最终标记显示如下:
<div class="wall">
<div class="good">
<div class="brick"></div>
</div>
<div class="bad">
<div class="brick"></div>
</div>
</div>
B)在砖块上调用setRenderBodyOnly(true),最终标记显示如下:
<div class="wall">
<div class="brick"></div>
<div class="brick"></div>
</div>
在选项A中,我现在有一个额外的包装div,我不想要它可能会或可能不会弄乱我的布局。在选项B中,我丢失了控制我的布局的类。这两个选项在我看来是不可接受的,但我不知道它们的适当解决方案。
似乎我可以对砖面板进行子类化,以便我有一块好的砖和一块坏的砖面板,但这个解决方案所需的代码量是非常的。
帮助?
答案 0 :(得分:0)
(忽略Java方面,我认为不相关)
实际上,实际上最简单的方法是在Java端干净地完成这项工作。
在“wall”组件的代码中,您可能会遇到类似的内容:
add(new BrickPanel("abrick", ... );
add(new BrickPanel("bbrick", ... );
您可以使用AttributeAppender
在Java中添加不同的类:
BrickPanel a = new BrickPanel("abrick", ... );
BrickPanel b = new BrickPanel("bbrick", ... );
a.add(new AttributeAppender("class", "good"));
b.add(new AttributeAppender("class", "bad"));
add(a);
add(b);
如果它们共享一个共同的“brick”类属性,则可以将其保留在共享标记中。这个appender只会添加“好”或“坏”。
当然,你也可以是子类,并且区分这两者的代码量相当于在两个子类中使用不同的属性appender调用,所以它确实不是很残忍。
答案 1 :(得分:0)
使用此标记:
<wicket:panel>
<div class="wall">
<div wicket:id="goodBrickPanel"></div>
<div wicket:id="badBrickPanel"></div>
</div>
</wicket:panel>
创建z BrickPanel
并在那里设置类:
class BrickPanel extends Panel
{
public BrickPanel(String id, boolean someCondition)
{
super(id);
String cssClass = "brick " + someCondition ? "good" : "bad";
add(AttributeModifier.replace("class", cssClass));
}
}
PS。尽可能避免setRenderBodyOnly(true)
。您将来可能需要这个标签用于样式或ajax更新。