2014-04-18 38 views
0

現在和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> 
  • OR -

B)呼叫setRe nderBodyOnly(真)的磚,與最終的標記顯示如下:

<div class="wall"> 
    <div class="brick"></div> 
    <div class="brick"></div> 
</div> 

在選擇A我現在有一個我不想額外包裝DIV可能會或可能不會弄亂我的佈局。在選項B中,我失去了控制佈局的類。在我看來,這兩種選擇都是不可接受的,但我不知道它們的正確解決方案。

看來我可以對磚面板進行分類,這樣我就有了一塊好磚和一塊壞磚面板,但是這個解決方案所需的代碼量是非常大的。

幫助?

回答

0

(忽略Java方面,我不認爲這是相關的)

事實上,它實際上可能是最容易的乾淨做到這一點在Java端。

在你的「牆」的組件代碼,你可能有類似:

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調用,所以它確實不是非常殘酷。

+0

感謝您的迴應!我希望避免這樣的事情有兩個原因。首先,我真的不喜歡在Java中應用類,因爲它破壞了html的預覽功能。我知道我可以在兩個地方都應用這個類,但是我有重複的代碼可能會失去同步。其次,創建一個完整的Java類只是爲了包裝一個專門用於佈局的CSS類(它是困擾我的佈局部分)似乎很冗長。這可能只是更多的問題,無法在html中處理,因爲通常面板內容和佈局管理器是分開的。 – user1563125

0

有了這個標記:

<wicket:panel> 
    <div class="wall"> 
    <div wicket:id="goodBrickPanel"></div> 
    <div wicket:id="badBrickPanel"></div> 
    </div> 
</wicket:panel> 

創建ž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更新。

+0

感謝您的迴應!我明白這個答案,但它讓我感到沮喪,因爲這樣做會消除html的預覽能力。這也令人沮喪,因爲它強制代碼在我的原始面板(「磚塊」)外部應用磚塊類。我希望能夠將磚組件添加到我的頁面,並且始終是一塊磚頭,而不需要進一步的努力。我認爲這對Wicket來說是不可能的,但如果可用,我真的很想找到更好的方法。但是,這可能會達到最佳效果。感謝您的洞察! – user1563125

+0

當涉及到預覽功能時,就沒有問題了 - 你仍然可以在html中使用CSS類「brick good」和「brick bad」。 'AttributeModifier'將*替換*它們。 –

+0

這是真的,但它需要多少代碼重複。如果他們不同步,它可能會導致意外的行爲。從代碼角度來看,似乎沒有任何邏輯流程能夠實現我想要的。看起來我真正想要的是一種將佈局管理與樣式分開的方法。不幸的是,在HTML/CSS中它們是一樣的。我認爲我有一個使用慣例的解決方法,但它很糟糕。我可能只是做佈局東西內聯樣式和其他所有類。這樣我可以控制面板中的類並處理html中的佈局。 *嘆* – user1563125