2016-08-15 95 views
0

我有一個accordionPanel如下:顯示取決於條件的JSF值

<p:accordionPanel value="#{bean.list}" var="entry" 
    dynamic="true" cache="true"> 
    <p:tab title="#{entry.alias}"> 
     <h:panelGrid columns="2" cellpadding="10"> 
      <h:outputText value="#{entry.text}" /> 
     </h:panelGrid> 
    </p:tab> 
</p:accordionPanel> 

而在我的Managed Bean的初始化我兩個列表:

public void init(){ 
    acceuil = 1; 
    salles = salleService.listSalles(); 
    appareils = appareilService.list(); 
} 

我使用的是acceuil變量,以便當我將它設置爲1另一方面,如果將它設置爲2,我將在我的accordionPanel中使用appareils列表(請注意,appareil和salle對象具有相同的屬性aliastext,但它們沒有從它們擴展的通信類)。

所以在我的JSF頁面我想要做這樣的事情:

value="#{bean.acceuil == 1 ? bean.salles : bean.appareils}" 

我怎樣才能做到這一點?

回答

1

所以在我的JSF頁面我想要做這樣的事情:

value="#{bean.acceuil == 1 ? bean.salles : bean.appareils}" 

我怎樣才能做到這一點 ?

一種方法就是你提到的。這種方法沒有錯。如果這對你不起作用,那麼其他的東西一定會出錯。您甚至可以在「運行時」在兩個列表之間切換。請參見下面的示例:

JSF形式:

<h:form> 
    <h:outputText value="foobar is: #{myBean.foobar}" /> 
    <p:accordionPanel value="#{myBean.foobar == 1 ? myBean.fooList : myBean.barList}" 
         var="entry" dynamic="true" cache="true"> 
     <p:tab title="#{entry.foo}"> 
      <h:panelGrid columns="2" cellpadding="10"> 
       <h:outputText value="#{entry.bar}" /> 
      </h:panelGrid> 
     </p:tab> 
    </p:accordionPanel> 
    <p:commandButton actionListener="#{myBean.toggle()}" update="@form"/> 
</h:form> 

輔助Bean:

@Named 
@ViewScoped 
public class MyBean implements Serializable { 

    @Getter private List<Foo> fooList = new ArrayList<>(); 
    @Getter private List<Bar> barList = new ArrayList<>(); 
    @Getter private int foobar; 

    @PostConstruct 
    private void init() { 
     foobar = 1; 
     fooList.add(new Foo()); 
     fooList.add(new Foo()); 
     fooList.add(new Foo()); 
     barList.add(new Bar()); 
     barList.add(new Bar()); 
    } 

    public void toggle() { 
     if(foobar == 1) { 
      foobar = 2; 
     } else { 
      foobar =1; 
     } 
    } 
} 

的POJO:

@Data 
public class Foo { 
    String foo = "Foo: Foo"; 
    String bar = "Foo: Bar"; 
} 

@Data 
public class Bar { 
    String foo = "Bar: Bar"; 
    String bar = "Bar: FOO"; 
} 

結果:

enter image description here

點擊按鈕後:

enter image description here

然而,就像它在通過@XtremeBiker其他答案建議以及我寧願一個解決方案。您應該儘量減少演示文稿中的邏輯。但是,如果你不允許或者不能在這裏寫出正確的代碼,那麼這樣的小事情可能會好起來。

1

乾淨的解決方案是提供一個由SaleAppareil類實現的接口。你將它們限制合同是這樣的:

public interface AliasAndText{ 
    public String getAlias(); 
    public String getText(); 
} 

然後在你的託管bean,使用一個單獨的列表,而你提供正確的操作方法來更改acceuil字段的值。你定的代碼相比,該方法調用單個服務方法每次,最大限度地減少對性能的影響:

private List<AliasAndText> list; 

private int acceuil = 0; 

public void init(){ 
    //Initialize with the default acceuil value 
    loadList(); 
} 

private void loadList(){ 
    if (acceuil == 0){ 
     list = appareilService.list(); 
    } 
    else{ 
     list = salleService.listSalles(); 
    } 
} 

public void actionSwitch(){ 
    acceuil = acceuil == 0 ? 1 : 0; 
    loadList(); 
} 

public List<AliasAndText> getList(){ 
    return list; 
} 
+0

對不起,但我沒有權利創建一個新的接口或類,我必須使用jsf來做。 –

+1

你總是可以擴展'Sale'和'Appareil'來創建實現'AliasAndText'接口的視圖助手類。否則,您可以使用原始類進行迭代,但是,如果字段名稱發生更改,您的視圖將被打破,不會出現編譯錯誤。 –