2011-04-28 57 views
10

我想擁有一個與模型綁定的可重用UI組件。如何在JSF中創建可重用組件?

例如:

  1. 我有一個鏈接到另一個selectOneMenu用於一個selectOneMenu用於(如部門 - >子部門)
  2. 想使之成爲一個複合材料部件
  3. 這種複合組件將被綁定到特定的JSF豆

我認爲這個想法的作品,如果即時通訊只使用一個compositeComponent。

但是,如果我使用相同類型的多個compositeComponent的,這不會起作用,因爲compositeComponent的JSF豆將是相同的(在這個例子中,即時通訊使用的視圖範圍內),並且將共享狀態在一個或多個複合組件之間。

這是一個粗略的例子,說明了我的困惑。在這種情況下,Page1.xhtml(與Page1Bean.java的主模型),利用了2個compositeComponents(其由MyCompositeComponent.java的JSF豆處理)

的複合元件將是這樣的:

<!-- one composite component that has 2 chained selectOneMenus --> 
<h:selectOneMenu 
    ... 
    value="#{myCompositeComponentBean.firstComboValue}" 
    valueChangeListener="#{myCompositeComponentBean.yyy}"> 
    <f:ajax event="valueChange" execute="@this" ... /> 
    <f:selectItem itemLabel="Choose one .." noSelectionOption="true" /> 
    <f:selectItems value="#{myCompositeComponentBean.firstComboList}" .... /> 
</h:selectOneMenu> 
<h:selectOneMenu 
    ... 
    value="#{myCompositeComponentBean.secondComboValue}" 
    valueChangeListener="#{myCompositeComponentBean.bbb}"> 
    <f:selectItem itemLabel="Choose one .." noSelectionOption="true" /> 
    <f:selectItems value="#{myCompositeComponentBean.secondComboList}" .... /> 
</h:selectOneMenu> 

和複合組件的JSF豆會像:

// this model will serve the composite component 
@Named 
@Scope("view") 
public class MyCompositeComponentBean { 
    private String firstComboValue, secondComboValue; 
    private List<String> firstComboList, secondComboList; 
    ... 
} 

這是Page1.xhtml的示例:

.... 
main department : <my:comboChainComponent /> <!-- 2 select items will be rendered here --> 
secondary department : <my:comboChainComponent /> <!-- another 2 select items will be rendered here --> 
.... 

而且Page1Bean(JSF主要爲豆Page1.xhtml)

@Named 
@Scope("view") 
public class Page1Bean { 
    // inject the first bean for the composite component 1 
    @Inject private MyCompositeComponentBean bean1; 
    @Inject private MyCompositeComponentBean bean2; 
    ... 
} 

是否有可能實現這種重用的?

謝謝。

回答

4

爲什麼不使用這種方法。

<mytag:combo id="combo1" 
     value="#{bean.firstData}" 
     model="#{globalBean.getList()}" 
     update="form1:combo2" /> 

<mytag:combo id="combo2" 
     value="#{bean.secondData}" 
     model="#{globalBean.getSubList(bean.firstData)}" /> 

您可以使用複合屬性。

... 
<composite:interface name="combo"> 
    ... define your attributes here 
</composite:interface> 

<composite:implementation> 
<p:outputPanel id="content"> 
    <p:selectOneMenu id="select_menu_1" value="#{cc.attrs.value}"> 
     <f:selectItems value="#{cc.attrs.model}" /> 
     <p:ajax event="change" process="@this" update="#{cc.attrs.update}" /> 
    //add converter if you want 
    </p:selectOneMenu> 
</p:outputPanel> 
</composite:implementation> 

此致敬意。

2

在JSF 2.0中,創建複合組件很簡單。 這裏是一個很好的教程: http://weblogs.java.net/blog/driscoll/archive/2008/11/writing_a_simpl.html

+1

你好,謝謝你的回覆。我還沒有開發複合組件的技術困難,但更重要的是如何使這個複合組件可重複使用以及它的耦合JSF Bean,它可以在單個頁面中多次使用。 – bertie 2011-04-28 12:23:15

+0

嗨,阿爾伯特,你可以在單個頁面中使用複合組件(儘管我不太瞭解需求)。 – 2011-04-28 14:39:27

3

取決於你正在嘗試實現,你可以使用一些「支持組件」(=關聯到你的facelet複合材料構件的Java類)。看到這篇文章:http://weblogs.java.net/blog/cayhorstmann/archive/2010/01/30/composite-input-components-jsf

也許,根據你真正在做什麼,你可能會更好地定義你的複合組件,主要是使用更多的參數和更好的模型來傳遞值(如果需要)。我缺乏一些關於您的應用程序的知識以提供更好的建議。

+0

我意識到我原來的帖子還是缺乏。我會盡快建立一個簡單明瞭的例子來展示我的原始問題。感謝您的建議。 – bertie 2011-04-29 09:10:34

+0

使您的示例更簡單可能會有用,但我的印象是支持組件應該可以解決您的問題;-) – ymajoros 2011-04-29 09:51:57

2

不知道我完全理解你,但你可能想傳遞一個參數給你構建的componentComposition。

main department : <my:comboChainComponent worksOn="#{page1Bean.bean1}" /> <!-- 2 select items will be rendered here --> 
secondary department : <my:comboChainComponent worksOn="#{page1Bean.bean2}"/> <!-- another 2 select items will be rendered here --> 

希望它可以幫助...

相關問題